Вопросы с тегами [generics]

1

голосов
3

ответ
53

Просмотры

Каковы ограничения на дженерики в иерархии наследования?

Предположим, что существует классы / интерфейсы иерархии: класс А {Т метод (T T) {возвращение т; }} Класс В расширяет {T метод (T T) {// метод (Т)»в '' столкновений с 'B методом (T)' в 'A'; оба метода имеют же стиранию, но ни один не перекрывает другой обратный т; }} Как мы видим, есть ошибка компилятора. Я никогда не сталкивался с правилами, как лечить дженерики, когда унаследуют. Какие существуют ограничения? (Пожалуйста, не следует путать с наследованием В самом общего типа, я спрашиваю о наследовании в исходных классах также не следует путать с «Что таким сырым типом», я знаю, необработанные тип, на этот вопрос я хочу фигуру , каковы правила наследования) также не следует путать думая, что я хочу исправить эту ошибку. Из класса Конечно B Расширяет это исправить. Мой вопрос о: "
J.J. Beam
1

голосов
1

ответ
35

Просмотры

Машинопись: Исключить не исключает мой тип

Я построил функцию, называемую компактен, что это функция сделать, чтобы удалить все falsy значение в массиве. Это Java-реализация компактен: функция компактна (обр) {возвращение arr.filter (Boolean); } Const MyData = [0, 1, NULL, 2, не определено, '']; console.log (компактный (MyData)) // => [1, 2] Это Машинопись набрав часть компактна: тип Falsy = ложь | нуль | 0 | '' | не определено; Компактный тип = Исключить; // некоторый правильный тип теста MyData = [0, 1, NULL, 2, не определено, '']; тип MyDataWithoutFalsy = Compact // => тип MyDataWithoutFalsy = 1 | 2 Теперь, вот странная часть, когда я подключить его с компактным кодом, это на самом деле не работает: функция компактна (обр: T): Compact {вернуть arr.filter (Boolean) в договоре; } Пусть MyDataWithoutFalsy = компактно ([0, 1, NULL, 2, не определено, '']); // => пусть MyDataWithoutFalsy: строка | число, но оно должно быть `number` только, потому что пустая строка должна быть исключена. Он должен быть только номер, потому что пустая строка должна быть исключена.
Joseph Wang
1

голосов
2

ответ
44

Просмотры

В Котлин, что такое правильный способ проверить, если значение универсального типа реализует интерфейс, а затем использовать его в качестве этого интерфейса?

Учитывая метод, который принимает параметр универсального типа, я хотел бы проверить, если тип реализует Сопоставимые, и если да, то сравнить его с другим значением. Предполагая, что параметр типа Т, поскольку Т стирается, тест вида т сравнимо не представляется возможным, даже с параметрами овеществленных типа. Испытание вида Т Сопоставимые возможно и работает, но т не может быть использован в качестве Сопоставимые, потому что сравнимое из прогнозировалось. весело изучить (а: T, B: T) {если (а это Сопоставимые) {а
abhijat
1

голосов
2

ответ
50

Просмотры

Java Дженерики: Возвращает тип другого типа

Это может быть возможно дубликат на другой вопрос здесь, но я искал, но не мог получить вопрос, который я хотел. Просьба указать мне на подобный вопрос, если таковые имеются. Можно ли вернуть родовое из родовой? Вот что я имею в виду: публика T MyMethod (класс classT, класс classK) {реализация //...method} Так что если я называю этот метод с List и Integer должен работать следующим образом: Список listOfIntegers = MyMethod (List.class, Integer.class);
Kihats
0

голосов
2

ответ
263

Просмотры

Может ли класс типа имеет абстрактный Scala элементы типа?

У меня есть этот класс типов: запечатанные Trait DbValueOps [T Некоторые из них (новый DbString (newContent)) случай ложного => None} Защита fromString (newContent: String): Опция [DbString] = это (newContent) Защиты isValidContent (newContent: String): ! Boolean = newContent.isEmpty}} Но при попытке использовать экземпляр класса типа что-то вроде dbStringOps.isValidContent (newContent), где newcontent является строкой, я получаю несоответствие типов: найдено: newContent.type (с подстилающим типом String) требуется : database.DbOps.dbStringOps.RI может заставить его работать путем преобразования R от абстрактного элемента типа с параметром типа, но это некрасиво, так как R уже определен, когда я пишу реализацию класса типа.
Frederik Baetens
1

голосов
0

ответ
112

Просмотры

Can Java recognize a type parameter, T, as a super type of some class?

Справочная информация: У меня есть 3 класса: A, B, C, где они все проходит «Супер» и инвентарем «Interface», и я хочу, чтобы написать код, который только использует только методы от «Супер» и «интерфейс» К сожалению, я не иметь контроль над исходным кодом A, B, C, «супер», «Интерфейс», чтобы изменить цепочку наследования, поэтому мой следующий подход заключается в использовании дженериков. Я на Java 6. Это то, что я и В и С, используются в других местах: пустота myMethodA () {@SuppressWarnings ( «флажок») Испытание Т = (Т) Гета (); } Если удалить бросок (T), Eclipse дает тип ошибки несоответствия: не может конвертировать от А до Т Если я держу бросание, тип безопасности: Переполнение отливать от А до Т Мой вывод был «Затмение (или Javac) не признать T как супер типа, как А. Для подтверждения Я изменен на Т расширяет Несвязанным & интерфейс. Затмение дал ошибка не может бросить от А до Т. Мой второй вывод был, «Затмение можно сказать, что T не супер типа А» Теперь я смущен, потому что мои выводы противоречат друг другу. Вопрос: Можно ли / ли Eclipse (или Javac) распознает параметр типа как супер типа класса? 2.а Если да, то почему я должен бросить с (Т), чтобы удалить ошибку и все еще получить предупреждение? 2б Если нет, то как Eclipse, дает ошибку, когда T меняется на T расширяет Unrelated и интерфейс? почему я должен бросить с (Т), чтобы удалить ошибку и все еще получить предупреждение? 2б Если нет, то как Eclipse, дает ошибку, когда T меняется на T расширяет Unrelated и интерфейс? почему я должен бросить с (Т), чтобы удалить ошибку и все еще получить предупреждение? 2б Если нет, то как Eclipse, дает ошибку, когда T меняется на T расширяет Unrelated и интерфейс?
Sgene9
1

голосов
0

ответ
55

Просмотры

Невозможно инициализировать универсальный тип с общим параметром метода

Я возиться с родовыми типами в игровых площадках Swift, когда я попытался использовать код ниже: класс Node {пусть значение: Т INIT (_ т: Т) {self.value = т} FUNC преобразования (к типу: U. Тип) -> Node? {Охранник пусть новое = значение, как? U еще {возвращение ноль} возвращение Node (новое)}} Примечание: Этот код является гипотетическим и не предназначен, чтобы сделать что-либо в реальном мире. В строке 12, где я вернуть новый узел из Node.convert (_ :), я получаю сообщение об ошибке: U»не конвертируются в„T“Теперь это кажется довольно странным для меня. В теории, так как мы можем создать узел с любым типом, мы не должны быть в состоянии использовать любой общий тип инициализации? Имеет ли это что-то сделать с помощью вывода типа не в состоянии определить тип?
Caleb Kleveter
1

голосов
1

ответ
281

Просмотры

Используйте общий расширенный быстрый класс в Objective-C

В моем проекте я много быстрых классов, расширяющих общие классы. И сейчас я нахожусь в необходимости отправки данных из Objective-C класса этих быстрых классов. Есть ли возможный способ сделать это? Я попытался с помощью @objc перед классом, как показано ниже, но она не позволила мне сделать это. Я после этого стека ссылки ответа. Но я проверил, когда я бег моего приложения с этим кодом впадины создать переменную в Project-быстром классе, как показано на рисунке ниже, как переменный не создаются здесь, так что это дает ошибку при вызове переменных в Objective-C классе. Просьба помочь с лучшим решением.
Parv Bhasker
1

голосов
1

ответ
82

Просмотры

Swift 4: generic conforming to AnyObject does not accept a protocol conforming to AnyObject

I need to create an array of type-safe weak references a structure that holds a 'type-safe' weak reference and can be an element of an array: public struct WeakRef: Hashable { public weak var ref: T? public let hashValue: Int init(_ ref: T) { self.ref = ref self.hashValue = ObjectIdentifier(ref).hashValue } } extension WeakRef: Equatable { public static func ==(lhs: WeakRef, rhs: WeakRef) -> Bool { return lhs.hashValue == rhs.hashValue } } extension WeakRef: Comparable { static public func < (lhs:WeakRef, rhs:WeakRef) -> Bool { return lhs.hashValue < rhs.hashValue } static public func Bool { return lhs.hashValue = (lhs:WeakRef, rhs:WeakRef) -> Bool { return lhs.hashValue >= rhs.hashValue } static public func > (lhs:WeakRef, rhs:WeakRef) -> Bool { return lhs.hashValue > rhs.hashValue } } I have a protocol which needs to be used with this weak ref: protocol LemmingTrackingProtocol: AnyObject { func onLemmingZPositionChanged() func onLemmingDrop() } this is possible: var trackers = [WeakRef]() but this is not: func addTracker(_ tracker: LemmingTrackingProtocol) { let tracker = WeakRef(tracker) //
Yaroslav Yaremenko
1

голосов
1

ответ
224

Просмотры

Java неоднозначный вызов метода с обобщениями

Java дженериков неоднозначный вызов метода в следующем примере: общественный класс Foo {общественного недействительными набор (атрибут Path, X значение) {...} общественного недействительными набор (атрибут Path, Expression
Sunnyday
1

голосов
1

ответ
42

Просмотры

Java не будет принимать параметр Map , когда метод подписи Map и MyClass реализует IMyInterface [дубликат]

Этот вопрос уже есть ответ здесь: Является ли список подкласс списка? Почему Java дженерик не неявно полиморфные? 16 ответов Что такое PECS (продюсер Расширяет Consumer Супер)? 12 ответов я получаю сообщение об ошибке: Ошибка: (6356, 38) Java: несовместимые типы: java.util.Map не могут быть преобразованы в java.util.Map Где класс я передаю это: частный абстрактный статический класс WordMLControl реализует IOfficeXmlControl { ...} И этот метод: защищено недействительный setProcessControl (Карта проки) {...} Почему это ошибка - я думаю, что это должно быть хорошо, как объекты реализовать этот интерфейс. Обновление: Хорошо, я понимаю, этот вопрос сейчас (спасибо Jorn). Но остается открытым вопрос, что» са хорошее решение для этого? В моем случае я всегда буду получать либо карту или Карта и эта карта только для чтения с.
David Thielen
1

голосов
0

ответ
49

Просмотры

Java generics and reflection to create and set model for SimpleJdbcCall in Spring

Я пытаюсь использовать отражение и дженерики для создания моделей с использованием SimpleJdbcCall. На данный момент я должен создать отдельную картографа за модель, которую я добавить к проекту. Я хотел бы создать картограф, который использует отражение для просто сопоставить модель, так что я только должен написать один картограф (в приведенном ниже способом). Вот моя реализация до сих пор: @Repository общественного абстрактного класса DAO {частного окончательного DataSource DataSource; ДАО (конечный источник данных DataSource) {this.dataSource = Datasource; } Список защищенных buildModels (SqlParameterSource sqlSource, класс modelBase) {конечная строка RESULT_SET = "RESULT_SET"; возвращение (Список) новый SimpleJdbcCall (DataSource) .withCatalogName ( "someCatalog") .withSchemaName ( "someSchema"). withProcedureName (getProcForModel (modelBase)) .returningResultSet (RESULT_SET (ResultSet RS, внутр RowNum) -> {/ * 1. получить реальный экземпляр ссылки modelBase, который передается в 2. получить ссылки на сеттеры экземпляра modelBase или быть в состоянии выбрать, где установить вещи в конструкторе петли modelBase 3. через ResultSet, настройка параметров на модели, где название инкубационного или конструктор арга совпадает с именем столбца в ResultSet * /}). выполнить ( sqlSource) .get (RESULT_SET); }} Класс modelBase ссылки прошли в, очевидно, будет класс, который наследует от абстрактного класса ModelBase. Проблемы, я перечислил выше, являются вещи, которые я не в состоянии понять, как я должен делать с помощью Reflection API в Java. Кто-нибудь знает, как сделать то, что я пытаюсь достичь? Кроме того, некоторые из значений, поступающих из Resultset не может быть струнные, а скорее например, даты и логическое значение. Как бы я рефлекторно вызвать правильный метод на Resultset? т.е. getInts () или GetDate () или getBoolean () и т.д.
resu
1

голосов
0

ответ
394

Просмотры

Ошибка C ++: запрос члена ... который имеет типа неклассового

Я пытался смотреть на другие подобные вопросы, но все они, кажется, содержат ответы относительно особенность c11 я использую. При выполнении следующего кода я получаю сообщение об ошибке: Ошибка: запрос на член «тока» в «((МТМ :: MtmSet) это) -> МТМ :: MtmSet :: it.mtm :: MtmSet :: итератор :: operator- > ()», который является не-класса типа 'сопзЬ Int' IT-> ток = NULL; в некоторых частях моего файла MtmSet.h. Эти файлы я использую. Я действительно в убыток, поэтому я боюсь, что я не знаю, какая часть имеет отношение, но попытались опустить как можно больше. Линии ошибок помечены Жирный + подчеркнутый. main.cpp: #include "MtmSet.h" INT основных () {MtmSet установлен; возвращать 0; } MtmSet.h: #ifndef MTM4_SET_H #define MTM4_SET_H # include Пространство имен MTM {шаблон класса MtmSet {/ ** * Узел в множестве * / класса Node {тип данных; Узел * следующий; общественности: Тип и GetData () {возвращение данных; } Узел GetNext () {вернуться * следующий; } Узел () = по умолчанию; Явный Узел (тип данных): данные (данные), следующий (NULL) {}}; Узел * первый; общественности: // Переслать объявление класса const_iterator; / ** * итератор для Set * / класс итератора {Node * тока; общественности: / ** * Пустой конструктор. Не должно быть разыменовываются. * То же, что MtmSet :: конец () * / итератор () = по умолчанию; / ** * Конструктор Set итератора * @param узел Узел итератор указывает на * / явного итератора (Node * узел) {текущего узла =; } / ** * Конструктор копирования * @param это Итератор для копирования * / итератор (константный итератор & его) {* это = это; } / ** * Destructor * / ~ итератор () = по умолчанию; итератор & оператор = (Const итератор & RHS) {тока = rhs.current; вернуться * это; } Тип конструкции & Const оператор * () {вернуть current-> GetData (); } Const Тип оператора * -> () сопзЬ {вернуть current-> GetData (); } Итератора и оператор ++ () {* ток = current-> GetNext (); вернуться * это; } Итератор оператор ++ (интермедиат) {итератора его = * это; * Ток = current-> GetNext (); верни это; } Оператор BOOL == (Const const_iterator & RHS) сопзЬ {если (текущий == rhs.current) {возвращает истину; } Вернуться ложным; } BOOL оператор = (Const const_iterator & RHS) сопзЬ {вернуть (текущий == rhs.current)!; } Друг класса const_iterator; }; итератор его; const_iterator const_it; / ** * Пустой конструктор * Создает пустой набор * / MtmSet (): первый (NULL) {Первая ошибка на IT-> ток = NULL, и const_it-> ток = NULL ниже, в то время как все остальные строки возвращают ту же ошибку: IT-> ток = NULL; const_it-> ток = NULL; } / ** * Конструктор копирования * @param установить комплект для копирования * / MtmSet (константный MtmSet & набор) {} / ** * Destructor * Бесплатно все выделенной памяти в комплекте. * / ~ MtmSet () = по умолчанию; итератор вставка (Тип конструкции & эль) {Узел * а = новый узел (эль); если (первый == NULL) {первый = а; const_it-> = а ток; IT-> = а ток; верни это; } Если (содержит (эль)) {вернуть его; } В то время как (it-> current-> следующий! = NULL) {it-> ток = it-> current-> следующая; } IT-> current-> следующая = а; it-> ток = it-> current-> следующая; верни это; } Итератор находка (Тип конструкции & эль) {} const_iterator найти (Тип конструкции & эль) сопзЬ {IT-> ток = первый; в то время как (it-> ток! = NULL) {если (it-> current-> данные == эль) {вернуть его; }} Возвращают NULL; } BOOL содержит (Тип конструкции & эль) сопзИте {если (найти (эль)) {возвращает истину; } Вернуться ложным; }}; } // пространство имен MTM #endif // MTM4_SET_H Любая помощь будет принята с благодарностью.
Osmosis Johns
1

голосов
1

ответ
139

Просмотры

Родовой типа ограничение в переменном / объявлении поля

Предположим, у нас есть общий интерфейс: интерфейс экспорта IKeyValue {ключ: K; Значение: В; } Теперь мы хотим объявить переменную / поле и ограничения, какие типы могут быть использованы в качестве K и V: общественные пункты: IKeyValue []; Приведенный выше код не компилируется. Я использую машинопись 2.6. Как мы можем достичь этого в машинописном?
Alexander Abakumov
1

голосов
1

ответ
55

Просмотры

Как я могу решить мою проблему, связанные с Беспараметрическим конструктором при использовании дженерик с ограничением определенных

У меня есть класс, который я пытаюсь создать инъекции зависимостей для в моем файле StartUp.cs, как этот services.AddTransient (); Я также стараюсь передать в IContextFactory в конструктор, как этот общественный BlogPostRepository (IContextFactory blogPostContext), но я получаю ошибки на линиях выше о том, что «BlogPostContext» должен быть не абстрактный тип с конструктором публичного без параметров для того, чтобы использовать его в качестве Параметр «T» в общем типе или методе «IContextFactory» Я не уверен, почему, потому что я использую новый T () в качестве ограничения в моем интерфейсе декларации. Вот класс, я пытаюсь создать экземпляр открытого класса BlogPostContext {частного IMongoDatabase _mongoDatabase только для чтения; частное чтение IMongoClient _mongoClient; общественный IMongoCollection BlogPostModelCollection => _mongoDatabase. GetCollection ( "BlogPostModel"); общественного BlogPostContext (IMongoDatabase mongoDatabase, настройки IOptions) {_mongoDatabase = mongoDatabase; _mongoClient = новый MongoClient (settings.Value.ConnectionString); если (нуль = _mongoDatabase!) _mongoDatabase = _mongoClient.GetDatabase (settings.Value.Database); }} Общий интерфейс и это конкретное пространство имен реализации FloormindCore.Blog.Factory {общедоступный интерфейс IContextFactory где T: новый () {T Create (); }} С помощью системы; Пространство имен FloormindCore.Blog.Factory {класс ContextFactory общественности: IContextFactory где T: новый () {общественного T Create () {возвращение (T) Activator.CreateInstance (TypeOf (T)); }}} общественного BlogPostContext (IMongoDatabase mongoDatabase, настройки IOptions) {_mongoDatabase = mongoDatabase; _mongoClient = новый MongoClient (settings.Value.ConnectionString); если (нуль = _mongoDatabase!) _mongoDatabase = _mongoClient.GetDatabase (settings.Value.Database); }} Общий интерфейс и это конкретное пространство имен реализации FloormindCore.Blog.Factory {общедоступный интерфейс IContextFactory где T: новый () {T Create (); }} С помощью системы; Пространство имен FloormindCore.Blog.Factory {класс ContextFactory общественности: IContextFactory где T: новый () {общественного T Create () {возвращение (T) Activator.CreateInstance (TypeOf (T)); }}} общественного BlogPostContext (IMongoDatabase mongoDatabase, настройки IOptions) {_mongoDatabase = mongoDatabase; _mongoClient = новый MongoClient (settings.Value.ConnectionString); если (нуль = _mongoDatabase!) _mongoDatabase = _mongoClient.GetDatabase (settings.Value.Database); }} Общий интерфейс и это конкретное пространство имен реализации FloormindCore.Blog.Factory {общедоступный интерфейс IContextFactory где T: новый () {T Create (); }} С помощью системы; Пространство имен FloormindCore.Blog.Factory {класс ContextFactory общественности: IContextFactory где T: новый () {общественного T Create () {возвращение (T) Activator.CreateInstance (TypeOf (T)); }}} Value.ConnectionString); если (нуль = _mongoDatabase!) _mongoDatabase = _mongoClient.GetDatabase (settings.Value.Database); }} Общий интерфейс и это конкретное пространство имен реализации FloormindCore.Blog.Factory {общедоступный интерфейс IContextFactory где T: новый () {T Create (); }} С помощью системы; Пространство имен FloormindCore.Blog.Factory {класс ContextFactory общественности: IContextFactory где T: новый () {общественного T Create () {возвращение (T) Activator.CreateInstance (TypeOf (T)); }}} Value.ConnectionString); если (нуль = _mongoDatabase!) _mongoDatabase = _mongoClient.GetDatabase (settings.Value.Database); }} Общий интерфейс и это конкретное пространство имен реализации FloormindCore.Blog.Factory {общедоступный интерфейс IContextFactory где T: новый () {T Create (); }} С помощью системы; Пространство имен FloormindCore.Blog.Factory {класс ContextFactory общественности: IContextFactory где T: новый () {общественного T Create () {возвращение (T) Activator.CreateInstance (TypeOf (T)); }}} Новый () {T Create (); }} С помощью системы; Пространство имен FloormindCore.Blog.Factory {класс ContextFactory общественности: IContextFactory где T: новый () {общественного T Create () {возвращение (T) Activator.CreateInstance (TypeOf (T)); }}} Новый () {T Create (); }} С помощью системы; Пространство имен FloormindCore.Blog.Factory {класс ContextFactory общественности: IContextFactory где T: новый () {общественного T Create () {возвращение (T) Activator.CreateInstance (TypeOf (T)); }}}
ife labolz
0

голосов
1

ответ
17

Просмотры

Как справиться с этой ситуацией, касающейся реализацию интерфейса, используя дженерики?

Я с трудом с рефакторинга общего кода Java в Котлин, поскольку это более строгим. Я не знаю, что делать в той ситуации, которая у меня есть. В первую очередь у меня есть интерфейс TopicController, имеющий абстрактные методы подписки из которых некоторые из них содержат параметр типа: Class. Здесь следует реализовать класс Message. () У меня также есть осуществление TopicController а именно TopicControllerImpl. Этот класс имеет список узлов: VAL узлов: MutableList. Кроме того, в этом случае T должен осуществить сообщение. Для достижения этой цели я пытаюсь добавить орудие определения класса, как: TopicControllerImpl. Но, функции в TopicController также должны иметь это осуществить запись, и она не может быть от TopicControllerImpl derrived. Определение его, наоборот, так с интерфейсом TopicController заставляет меня, чтобы определить сообщение для TopicController, так: класс TopicControllerImpl (арг): TopicController. Таким образом, чтобы быть ясно: следующий код не компилируется успешно: TopicControllerImpl класс TopicControllerImpl / ** ?? * / (* [Арг] *): TopicController {частного знач узлы: MutableList переопределять удовольствие подписаться (тема: Строка, типа: Класс, абонент: Messenger) {вал узел = findOrCreateNode (тема, тип) node.addListener (абонент)} частная забава findOrCreateNode (тема: String, тип: Class): TopicNode {вар узел = findNode (тема), если {обратный узел} // Если узел еще не существует, создайте его, запустить его и добавить (узел! = NULL) это к узлу сбора = TopicNode (тема, тип) executor.execute (узел, конфигурация) nodes.add (узел) возвращает узел} // другие функции ...} TopicController интерфейс TopicController {/ ** ?? * / Весело подписаться (тема: String, тип: Класс, абонент: Messenger) // Другие методы} Так что я удивляюсь, как я могу это исправить sothat он успешно компилируется ... Надеюсь, я немного понятно, если у вас есть вопросы, пожалуйста, обращайтесь Больше подробностей.
Klyner
1

голосов
0

ответ
74

Просмотры

вложенные макросы в C _generic макро

Я в настоящее время делаю небольшую библиотеку SIMD вектора / матрицы в C. Я ищу использовать _generic функции макросъемки в C11, чтобы вызовы функции всегда принимают вектор (__ M128) аргументы в качестве указателей. Есть ли способ, чтобы иметь _generic Макровызов другой макрос, если не-указатель аргумент задан, а затем уже, что макрос Append «и» к аргументу, так что передается по ссылке? Вот пример моего текущего кода: ЬурейеЕ __m128 vec4; ЬурейеЕ __m128 * vec4_t; vec4_t vec4_new (vec4_t в); // динамически распределяет vec4 и копирует "в" #define vec4_print (X, Y) _Generic ((X), __m128: vec4_print_val, __m128 *: vec4_print_ptr) (X, Y) аннулируются vec4_print_val (vec4 v, FILE * из); недействительный vec4_print_ptr (vec4_t v, FILE * из); В основном то, что я спрашиваю, есть ли» с каким-либо образом, чтобы обеспечить функцию vec4_print_ptr всегда вызывается и первый аргумент преобразуется в указатель, если это необходимо. Кроме того, скажите, пожалуйста, если я собираюсь об этом в ту сторону, но моя цель состоит в том, чтобы избавить пользователей от необходимости обращаться vec4 указатели и значения по-разному при использовании их в качестве аргументов и убедитесь, что vec4 всегда передается по ссылке в функции с помощью этого макроса , Модифицированный код: vec4.h #include #include ЬурейеЕ __m128 vec4; ЬурейеЕ __m128 * vec4_t; vec4_t vec4_new (vec4_t в); // динамически распределяет vec4 и копирует "в" #define vec4_print (X, Y) _Generic ((X), __m128: vec4_print_ptr (& X, Y), __m128 *: vec4_print_ptr (X, Y)) аннулируются vec4_print_val (vec4 VEC, FILE * из); недействительный vec4_print_ptr (vec4_t VEC, FILE * из); vec4.c #include "vec4.h" # include # include # include vec4_t vec4_new (vec4_t в) {пустота * new_vec; posix_memalign (& new_vec, 16, SizeOf (__ m128)); если (в == NULL) {MemSet (new_vec, 0, SizeOf (__ m128)); } Еще тетсру (new_vec, в, SizeOf (__ m128)); вернуться (__m128 *) new_vec; } Недействительными vec4_print_val (vec4 VEC, FILE * уходит) {плавать TMP [4]; _mm_store_ps (TMP, VEC); утверждать (TMP! = NULL); для (INT I = 0; г <4; ++ я) fprintf (из "% F", TMP [I]); fprintf (из "\ п"); } Недействительными vec4_print_ptr (vec4_t VEC, FILE * уходит) {плавать TMP [4]; _mm_store_ps (TMP, * VEC); утверждать (TMP! = NULL); для (INT I = 0; г <4; ++ я) fprintf (из "% F", TMP [I]); fprintf (из "\ п"); } Main.c #include "vec4.h" INT основных (недействительными) {vec4 v1 = _mm_set_ps (5.0f, 3.2f, 0.3f, 1.0f); // стек __m128 vec4_t v2 = vec4_new (& v1); // динамически назначаемый __m128 vec4_print (v1, стандартный вывод); vec4_print (v2, стандартный вывод); возвращать 0; } Clang -std = C11 выход: https://pastebin.com/Jgm1qZVE
shotgunbilly
1

голосов
0

ответ
55

Просмотры

Как создать экземпляр внутреннего общего типа типа псевдонима с TypeTag или ClassTag?

Я знаю, как сделать это с манифестом. Я задаюсь вопросом, как я могу сделать это с TypeTag или ClassTag. Просто FYI, общий тип псевдонимами. случай, класс S () случай, класс М () случай, класс MyMultiPurposeClass [Т] (член: Т) типа MyTypeS = MyMultiPurposeClass [S] Тип MyTypeM = MyMultiPurposeClass [M] Защиту создать [T] (неявное тег: TypeTag [Т], М.Ф. : Manifest [T]): T = {// это этот шаг я хочу знать, как сделать это с TypeTag или ClassTag. член вала = mf.typeArguments.head.runtimeClass.getConstructors.head.newInstance () // Но, конечно же, конечная цель этой функции заключается в создании MyTypeS // или экземпляр MyTypeM. ev.runtimeClass.getConstructors.head.newInstance (член) // Проделайте то же самое с тегом. ??? } Создать [MyTypeS] создавать [MyTypeM]
lniniaa
1

голосов
2

ответ
87

Просмотры

Сырой типа в Java дженерик связан

Сырые типы допускается в пределах дженериков? Что их точное значение? класс Foo {} класса Bar {} вместо написания класса Bar {} второй вариант менее удобен в месте использования; может быть первым считается каким-то образом эквивалентны, хотя и по-другому? класс Bar
Edoardo Vacchi
1

голосов
1

ответ
69

Просмотры

Почему это не ведет себя так, как я ожидал (надеюсь) это будет?

У меня есть несколько протоколов, установленных в моих базах для борьбы с ресурсами. В одном из протоколов, я настроил расширение, чтобы обеспечить реализацию по умолчанию для функции декодирования. Это проще, чтобы показать код и то, что происходит (см звонки в FatalError). Там намного больше кода в фактической реализации, но это иллюстрирует этот вопрос: это «базовый» протокол: общественный протокол Изобретательный {associatedtype AssociatedResource typealias ResourceCompletionHandler = -> Пустота функ выборки (_ завершение (AssociatedResource ?, ошибка?): @ избежать ResourceCompletionHandler)} Это общий, бетона implementaion из Resourceful: открытого класс WebResourceApiCall: Находчивый {общественный typealias AssociatedResource = Ресурс общественного typealias FetchedResponse = (данные: данные ?, urlResponse: ? URLResponse) общественного инициализации () {} принести публичное FUNC (_ завершение: @escaping ResourceCompletionHandler) {попробовать! декодирование (неправдоподобный: (данные: ноль, urlResponse: ноль))} общественного функ декодирование (неправдоподобное: FetchedResponse) бросает -> Ресурс {FatalError ( "Он заканчивается здесь, но я не хочу его!")}} расширение WebResourceApiCall где Ресурс: декодируемые {общественного функ декодирование (неправдоподобный: FetchedResponse) бросает -> Ресурс {FatalError ( «Это где я хочу, чтобы это ...»)}} Это, как я пытаюсь использовать его: общественную-структуру Что-то: декодируемый {} вар apiCall = WebResourceApiCall () apiCall.fetch {_, _ в} // неявно вызывает расшифровывает ... но не расшифровываю я ожидал, что это! См FatalError () вызывает ... Вместо вызова декодирования на расширении, как я надеялся, что это будет, метод декодирования «по умолчанию» без каких-либо ограничений, всегда называется. Почему это не работает так, как я ожидаю, что это? Заранее спасибо!
cue8chalk
1

голосов
0

ответ
80

Просмотры

Джексон Список десериализатор Родовой тип с ContextualDeserializer

У меня есть этот JSon объект [{ «Имя»: «Алиса», «возраст»: 37}, { «имя»: «Боб», «возраст»: 37}] Я видел этот пример, и он работает, как я могу адаптировать это список людей Как создать пользовательский десериализатор в Джексон для универсального типа? общественного класса Упаковочный статическое {значение общественного Т; } общественного класса людей {общественности Список людей; } Класс Person общественного {имя общественного обертка; Упаковочный возраст населения; } Я хотел бы использовать JsonDeserialize и ContextualDeserializer десериализацию объект JSON со списком людей, использующими Java общего типа, так что вы можете использовать класс для других объектов общественного статического класса WrapperDeserializer расширяет JsonDeserializer
Pako
1

голосов
0

ответ
101

Просмотры

Кураж, как установить класс шаблона в качестве API конечного типа возвращаемого значения

Я использую чванство документировать свой API и один из моих конечных точек возвращается общий тип QueryResult: @GET @Path ( «/ запрос») @ApiOperation (ответ = QueryResult.class) публичное QueryResult queryHttpGet () {возвратить новый QuertyResult ( ); } Тем не менее, я не могу установить ответ = QueryResult.class в @ApiOperation, так что я не знаю, фактический тип в моем файле определения API, который генерируется. Есть несколько дискуссий: https://github.com/swagger-api/swagger-core/issues/498 https://github.com/kongchen/swagger-maven-plugin/issues/416 анс некоторое упоминание реализовать небольшой регулировочная шайба класса: класс MyTypeQueryResult общественности расширяет QueryResult {}, а затем передать ответ = MyTypeQueryResult к @ApiOperation, но я не могу заставить его работать. Любые идеи, как я могу видеть общий тип в моем определении развязности?
user1981275
1

голосов
0

ответ
37

Просмотры

Refactoring - Going from specific to generic interfaces

I have a question about refactoring and how to make interfaces and classes generic. Suppose I have the following situation: Before a plane can take off, a number of checks (validations) must be made. Some of these validations are on plane-level (e.g. plane has enough fuel). Other validations are on passenger-level (e.g. seatbelt is fastened). The idea is as follows: You can write a number of validation rules (fragments), that test specific criteria. For instance, you can have the plane-level validators: EnoughFuelValidatorFragment and WorkingLightsValidatorFragment. Similarly, you can have the passenger-level validators: SeatbeltFastenedValidatorFragment and PersonInRightSpotValidatorFragment. Now, I have written two interfaces PlaneValidatorFragment and PassengerValidatorFragment, with inner classes FragmentSequenceRunner and FragmentSequenceBuilder. The intention is to invoke a selection of validator fragments based on the TYPE_OF_PLANE and TYPE_OF_PASSENGER. The FragmentSequenceBuilder "chains" a selection of validators, whereas FragmentSequenceRunner runs validation on all selected validators. public interface PlaneValidatorFragment { List validate(TYPE_OF_PLANE); class FragmentSequenceRunner implements PlaneValidatorFragment { // ... @Override List validate(TYPE_OF_PLANE) { // Override implementation of validate() here. } } class FragmentSequenceBuilder { // Enough to build the sequence of validation fragments. } } public interface PassengerValidatorFragment { List validate(TYPE_OF_PASSENGER, TYPE_OF_PLANE); class FragmentSequenceRunner implements PassengerValidatorFragment { // ... @Override List validate(TYPE_OF_PASSENGER, TYPE_OF_PLANE) { // Override implementation of validate() here. } } class FragmentSequenceBuilder { // Enough to buikd the sequence of validation fragments. } } The idea is to be able to do something like this: Create a validator for any airplane type (e.g. Boeing737Validator), and check take off validation by selecting a number of existing validator fragments to run. Assume TYPE_OF_PLANE and TYPE_OF_PASSENGER are defined as classes, such as: - Boeing737 - AirbusA300 - BusinessClass - EconomyClass Muy current implementation is NOT generic. Instead of having PlaneValidatorFragment and PassengerValidatorFragment, I have Boeing737PlaneValidatorFragment and Boeing737PassengerValidatorFragment. public interface Boeing737PlaneValidatorFragment { List validate(Boeing737); class FragmentSequenceRunner implements Boeing737PlaneValidatorFragment { @Override List validate(Boeing737) {...} } class FragmentSequenceBuilder {...} } public interface Boeing737PassengerValidatorFragment { List validate(EconomyClass, Boeing737); class FragmentSequenceRunner implements Boeing737PassengerValidatorFragment { @Override List validate(EconomyClass, Boeing737) {...} } class FragmentSequenceBuilder {...} } Herein, the TYPE_OF_PLANE and TYPE_OF_PASSENGER is explicitly defined. Instead, I would like to make the interfaces generic, to work with all types of planes and passengers (provide a Class as a parameter). Something like the following: public interface PlaneValidatorFragment { List validate(T typeOfPlane); class FragmentSequenceRunner implements PlaneValidatorFragment { @Override List validate(T typeOfPlane) {...} } class FragmentSequenceBuilder { // Enough to build the sequence of validation fragments. } } public interface PassengerValidatorFragment { List validate(T typeOfPassenger, S typeOfPlane); class FragmentSequenceRunner implements PassengerValidatorFragment { @Override List validate(T typeOfPassenger, S typeOfPlane) {...} } class FragmentSequenceBuilder { List fragments; } } TL;DR: How can I make the interfaces PlaneValidatorFragment and PassengerValidatorFragment generic? That is; how can I parameterise them to take in TYPE_OF_PLANE and TYPE_OF_PASSENGER (as classes). Am I on the right track?
northerner
1

голосов
0

ответ
712

Просмотры

Использование в качестве конкретного типа в соответствии с протоколом не поддерживается

Я хочу, чтобы создать общий контроллер представления для страницы настроек. Сейчас настройки приходят из JSON, но реализация может быть переключена позже, поэтому я хочу иметь протоколы. Например, протокол LanguageSetting пуст, но с его помощью я могу по-прежнему сохраняют безопасность типов в будущем, без необходимости останавливаться на конкретной реализации (например, JSON декодирования). // Протоколы Протокол запроса {associatedtype Результат FUNC handleResult (с данными: Data) -> Результат} Настройка протокола {имя вар: String {} получить вар значок: URL? {}} Получить протокол LanguageSetting: Настройка {} протокол CountrySetting: Установка {} // реализации STRUCT LanguageSettingQuery: Запрос {FUNC handleResult (с данными: Data) -> [LanguageSetting] {возвращение попробовать! . JSONDecoder () декодирования ([JSONLanguageSetting] .self, из: данные)}} структура CountrySettingQuery: Запрос {FUNC handleResult (с данными: Data) -> [CountrySetting] {возвращение попробовать! . JSONDecoder () декодирование ([JSONCountrySetting] .self, из: данных)}} структура JSONLanguageSetting: LanguageSetting, декодируемая {вар имени: Строка значок вара: URL? } Структура JSONCountrySetting: CountrySetting, декодируемая {вар Имени: значок Строка вара: URL? } // родовой настройки просмотра контроллер класс LocaleViewController: UIViewController где LocaleQuery.Result: Последовательность, LocaleQuery.Result.Element: Установка {частный вара settingItems = [Настройка] () инициализаций (запрос: LocaleQuery) {settingItems = query.handleResult (с Данные ()), как! [Настройка] super.init (nibName: ноль, расслоение: ноль)} требуется Init (кодировщик aDecoder: NSCoder)? {FatalError ( "Init (кодировщик: пусть localeVC = LocaleViewController (запрос: LanguageSettingQuery ()) бросает ошибку: Использование «LanguageSetting» в качестве конкретного типа, соответствующего протокола «Настройка» не поддерживается Любые идеи о том, как я мог бы обойти эту проблему? На стороне записки: Почему здесь понижающее приведение необходимо? Не являются ли общие ограничения типа достаточно для обеспечения этого? settingItems = query.handleResult (с: Data ()), как! [Настройка] пусть localeVC = LocaleViewController (запрос: LanguageSettingQuery ()) бросает ошибку: Использование «LanguageSetting» в качестве конкретного типа, соответствующего протокола «Настройка» не поддерживается Любые идеи о том, как я мог бы обойти эту проблему? На стороне записки: Почему здесь понижающее приведение необходимо? Не являются ли общие ограничения типа достаточно для обеспечения этого? settingItems = query.handleResult (с: Data ()), как! [Настройка]
Balázs Vincze
1

голосов
0

ответ
100

Просмотры

Ковариантный (уходит) и универсальный тип Kotlin

В Java я могу сделать это: интерфейс BaseInterface {} Интерфейс ExtendsInterface расширяет BaseInterface {} Интерфейс ProblemInterface общественных {аннулируются метод (Е BaseInterface); } Класс Основное {государственной статической силы основных (String [] арг) {ProblemInterface problemInterfaceExtendsInterface = новый ProblemInterface () {@Override общественного недействительными метод (ExtendsInterface BaseInterface) {}}; ProblemInterface
user2855001
1

голосов
0

ответ
30

Просмотры

Refactor repetitive EntityFramework's Fluent API statements

Я в настоящее время имеют следующие (отрывок) код, чтобы правильно сопоставить многие-ко-многим в EF Core: modelBuilder.Entity () .HasKey (рс => новый {pc.TranslationId, pc.LifeCourseId}); modelBuilder.Entity () .HasOne (рс => pc.LifeCourse) .WithMany (р => p.LifeCourseNameTranslations) .HasForeignKey (рс => pc.LifeCourseId); modelBuilder.Entity () .HasOne (рс => pc.Translation) .WithMany (с => c.LifeCourseNameTranslations) .HasForeignKey (рс => pc.TranslationId); modelBuilder.Entity () .HasKey (рс => новый {pc.TranslationId, pc.StrataId}); modelBuilder.Entity () .HasOne (рс => pc.Strata) .WithMany (р => p.StrataNameTranslations) .HasForeignKey (шт => шт. StrataId); modelBuilder.Entity () .HasOne (рс => pc.Translation) .WithMany (с => c.StrataNameTranslations) .HasForeignKey (рс => pc.TranslationId); modelBuilder.Entity () .HasKey (рс => новый {pc.TranslationId, pc.PointId}); modelBuilder.Entity () .HasOne (рс => pc.Point) .WithMany (р => p.PointLabelTranslations) .HasForeignKey (рс => pc.PointId); modelBuilder.Entity () .HasOne (рс => pc.Translation) .WithMany (с => c.PointLabelTranslations) .HasForeignKey (рс => pc.TranslationId); И это будет продолжаться еще некоторое время. Они, кажется, очень повторяющееся и выглядят как нечто такое, что может быть переработан в серию вызовов методов, которые ищут что-то вроде BindJoinTable (ModelBuilder,
Slava Knyazev
1

голосов
0

ответ
102

Просмотры

Бинарный оператор «+», не может быть применен к операндам типа «Т» и «U»

Я пишу ниже функции, чтобы поменять два номера без использования третьей переменной, но при компиляции кода я столкнулся ниже ошибки. Бинарный оператор «-» не может быть применен к операндам типа «T» и «U» фрагмент кода Func подкачки (а: Т, Ь: U) {вар value1 = а переменная значение2 = Ь значение1 = значение1 + значение2 значение2 = значение1 - значение2 значение1 = значение1 - значение2 печать (value1) печать (значение2)} Любая помощь будет оценена.
Aman.Samghani
1

голосов
0

ответ
50

Просмотры

Принудительно параметр представляет собой случай класса

Я пытаюсь создать функцию, которая принимает обобщенный класс случая, но я хочу, чтобы убедиться, что передаваемый параметр действительно случай класс. Поиск подвернулся только вещи о наследовании с самостоятельными классами, определенными случаями, но не об общих классах случае. Гарантированный, грязнее, способ сделать это, чтобы использовать отражение, чтобы запустить проверку на пройденный объект класса случай, прежде чем делать. Если это не так, бросить исключение: Защиту handleCaseClass [A] (caseClass: A): Unit = {вал isCaseClass = // использование отражения для проверки (isCaseClass) {/ * работа * /} еще {бросать InvalidArgumentException }} Это может получить немного грязный, но не имеет большого значения. Мне было интересно, если там был чище путь, используя оценки типа, но я искал вокруг и не может найти что-нибудь подобное: Защиту handleCaseClass [A
NateH06
1

голосов
1

ответ
28

Просмотры

Ошибка выполнения во время литья объекта

Я работаю над проектом, машинопись и в то время как код компилируется хорошо и во всей теоретической области понятий код должен работать, он не работает в режиме исполнения. Я сузил проблему проблемы, которая является то, что машинопись преобразуется в JavaScript после компиляции. А это значит, нет определенных классов и типов переменных (проток типирование аки интерпретируемого языка). Теперь, когда мне нужна помощь, чтобы получить эту работу. Ниже представлена ​​структура класса: Базовые классы Когда я получаю ответ от API, я бросил его в класс типа базового класса BaseCollectionTypeResponseModel {защищаемого responseData: Array; защищенная пагинация: PaginationResponseModel; } На PaginationResponseModel определяется следующим образом: класс PaginationResponseModel {защищенных TotalItems: номер; защищенные TOTALPAGES: номер; защищенный CurrentPage: номер; защищенный ITEMCOUNT: номер; } Теперь я интерфейс, определенный, который имеет функцию ConvertViaAdapter (), как показано ниже: интерфейс IConvertable {ConvertViaAdapter (); } Класс образец, который реализует интерфейс ниже: Класс PlatformResponseModel реализует IConvertable {защищенного статуса: число; Запатентованное название: строка; защищенный platformid: строка; защищенные теги: строка []; защищенный тип: строка; защищенная версия: строка; защищенное Описание: строка; ConvertViaAdapter (): PlatformModel {вернуться Object.assign (новый PlatformModel (), это)}} Теперь я создаю дочерние классы, которые используют функциональные возможности базового класса для обеспечения применения конкретных функциональных возможностей. Ребенок Классы: например, класс пагинации детей выглядит, как показано ниже: Класс PaginationModel расширяет APIResponses.PaginationResponseModel {получить TotalItems (): число {возвращение this.totalItems} получить TOTALPAGES (): число {вернуться this.totalPages} получить CurrentPage (): число {вернуться this.currentPage} получить ITEMCOUNT (): число { вернуться this.itemCount}} Теперь это, где все становится сложнее: я продлил PlatformResponseModel, как показано ниже: класс PlatformFunctionalModel расширяет PlatformResponseModel {получить имя (): String {вернуться this.name} получить IsActive (): Boolean {если (это. тип == 0) Возвращает True; вернуть значение False; }} Я также продлил BaseCollectionTypeModel, используя Generics, как показано ниже: Класс CollectionTypeBaseModel расширяет BaseCollectionTypeResponseModel {личное _responseData: Array = [] получить ResponseData (): Array {если (this._responseData == NULL || this._responseData.length <1) {this.responseData.forEach ((данные) => {this._responseData.push (данные. ConvertViaAdapter ());}); } Вернуть this.responseData; } Набор ResponseData (данные: Array) {this.responseData = данные this._responseData = данные} получить Разбивка (): PaginationModel {вернуться Object.assign (новый PaginationModel (), this.pagination)}} Проблема находится на строке кода this.responseData.forEach () в вышеприведенном классе, я получаю сообщение об ошибке: Тип объекта не имеет метод ConvertViaAdapter (). Теперь все должно работать так, когда TObject расширяет IConvertable интерфейс, пункты списка типа TObject бы того, функция определена и реализована иначе код не был бы составлен. Мне нужна помощь. Пример JSON { "responseData": [{ "статус": 2, "имя": "HelloSample", "platformid": "A1B2C3", "метки": [ "привет", "образец"], "типа":» дельта " "вариант": "1.0", "описание": "Только образец"}], "нумерация страницы": { "TotalItems": 10, "TotalPages": 5, "CurrentPage": 1," ItemCount «: 2}} Стартер код: вар ObjectData = JSON.parse (jsonData); вар myCastedData = Object.assign (новый CollectionTypeBaseModel (), ObjectData) 1, "ItemCount": 2}} Стартер код: вар ObjectData = JSON.parse (jsonData); вар myCastedData = Object.assign (новый CollectionTypeBaseModel (), ObjectData) 1, "ItemCount": 2}} Стартер код: вар ObjectData = JSON.parse (jsonData); вар myCastedData = Object.assign (новый CollectionTypeBaseModel (), ObjectData)
iam.Carrot
1

голосов
2

ответ
48

Просмотры

Overriding the compareTo method with a class that is nested inside another class which extends Comparable

I am tasked with writing my own PriorityQueue class in Java. It is based on LinkedLists. To quote the directions: The type of the data stored in the nodes should be a generic type that is comparable. That is write for the class declaration: public class PriorityQueue (E extends Comparable)) -> note: the curly braces are meant to mean , whatever I write between is disappearing... I will be using the PriorityQueue to write two other classes, one of type patient, the other of waitingRoom. This is where the compareTo method will come into play, as I sort the two classes into their individual PriorityQueues. I have been defining the ListNode class inside of the PriorityQueue class itself, so I have a class within a class. Now comes the question: Where am I going to implement/Override the inherited compareTo method from Comparable? It can't get implemented in the PriorityQueue class because compareTo can only take one argument. Yet, this is where it seems like it should go, as this is the actual class extending Comparable. If I implement it inside the ListNode class, well, I have no idea how I would. Do I turn ListNode into an interface? An AbstractClass? Below is the quite novice code I have written, thanks for the help package hostpitalQueue; import java.util.AbstractList; public class PriorityQueue { private ListNode front; public PriorityQueue() { front = null; } public PriorityQueue(ListNode n1) { front = n1; } //method for addingNode to beginning, //perhaps overload method for next nodes? public void addNode(ListNode n1) { if(front == null) { front = n1; }else { //need to find last node and add n1 to it ListNode lastNode = findLastNode(n1); lastNode.addNode(n1); } } //need to compare, remember, this is a priorityqueue public ListNode findLastNode(ListNode n) { //compare the data of both //compare to front ListNode n1 = front; int i = n1.compareTo(n); //only do something here if n is higher priority if(i > 0) { E frontData = n1.data; E nodesData = n.data; ListNode holder = n1; front = n; n.next = holder; holder.previous = n; }else if(n1.next == null) { n1.next = n; n.previous = n1; } else { while(front.next != null) { n1 = front.next; //is n1 a higher priority? Integer ii = n1.compareTo(n); if(ii > 0) { //this means that we should return the previous node, to insert //before this one return n1.previous; } } } return n1; } public class ListNode { //contains a left and a right, as well as a data field public E data; public ListNode previous,next; //construct public ListNode() { data = null; previous = null; next = null; } //previous to next public ListNode(E data) { this.data = data; previous = null; next = null; } public ListNode(E data,ListNode n1) { this.data = data; previous = n1; next = null; } public ListNode(E data,ListNode n1,ListNode n2) { this.data = data; previous = n1; next = n2; } public void addNode(ListNode n1) { //gotta check if my next is null ListNode holder = null; if(this.next != null) { holder = this.next; } this.next = n1; n1.previous = this; n1.next = holder; } public int compareTo(ListNode n1) { return 0; } public void printMe() { System.out.println(this.data); } } }
awsunit
1

голосов
1

ответ
41

Просмотры

Safely casting a non-generic Collection to a homogeneous generic Collection

Я использую метод, как это бросить необщую коллекцию до однородного общего сбора безопасно, то есть сразу бросать ClassCastException: открытый статическая Коллекция safeCastCollection (конечная коллекция Коллекции, окончательный класс targetClass) {если (сбор == NULL) { возвращать нуль; } Collection.forEach (targetClass :: литье); вернуть коллекцию (Collection); } Теперь было бы неплохо иметь метод не возвращает коллекцию, но коллекция одного и того же базового типа (Set, List, ...) в качестве входного параметра. Лучшее, что я могу сделать это: открытые статические C safeCastCollection2 (конечная коллекция I, окончательный класс targetClass) {если (сбор == NULL) {возвращение нуль; } Collection.forEach (targetClass :: литье); вернуть коллекцию (С); } Это работает в большинстве случаев, кроме последнего: Список listOfStrings = Arrays. asList (новый String [] { "а", "б", "в"}); Набор setOfNumbers = новый HashSet (Arrays.asList (новое Целое [] {1, 2, 3})); Коллекция l0 = safeCastCollection (listOfStrings, String.class); // Сборник l1 = safeCastCollection (listOfStrings, String.class); // ошибка компилятора :-) // Список l2 = safeCastCollection (listOfStrings, String.class); // ошибка компилятора :-( Collection l3 = safeCastCollection2 (listOfStrings, String.class); // Сборник L4 = safeCastCollection (listOfStrings, String.class); // ошибка компилятора :-) Список l5 = safeCastCollection2 (listOfStrings, String.class ); // нет ошибки компилятора :-) Set l6 = safeCastCollection2 (setOfNumbers, Integer.class); Коллекция L7 = safeCastCollection2 (setOfNumbers, Integer.class); // Список L8 = safeCastCollection2 (setOfNumbers, Integer.class); // ошибка компилятора: -) Коллекция l9 = safeCastCollection2 (setOfNumbers, Integer.class); // нет ошибок компилятора :-( конечной строки следующего = l9.iterator () следующих ();. // среды исключение Любых идей, как улучшить ограничение на входном параметре?
ujay68
1

голосов
2

ответ
100

Просмотры

Empty constructor in parametrized class

У меня есть класс InteractiveChart, который оборачивает диаграммы (интерфейс) и добавляет интерактивность ему пользователь отображения взаимодействий сеттер вызовов на диаграмме. 1) Поскольку различные подклассы диаграммы могут иметь разные «лишние» возможности я хочу иметь добытчик в классе оберточного, который возвращает обернутую таблицу (без необходимости делать непроверенной бросок!). Единственный способ я знаю, чтобы сделать это, имея общий параметр в классе заворачивания. 2) Этот класс обертки также предназначен для использования в среде NetBeans GUI Builder, который имеет ограничение, что он требует пустого конструктора. Однако тип выполнения родового параметра определяется кодом экземпляра, и я не имею никакого контроля над тем, как это конкретизирует NetBeans. В этом случае я хочу, чтобы обернуть SimpleChart и если пользователь хочет, чтобы обернуть что-то еще, что они» d должны добавить метку-заполнитель JPanel в GUI и добавить диаграмму в том, что в пользовательском коде. Из-за того же ограничения, я не могу иметь общий параметр в классе заворачивания. общественный класс InteractiveChart расширяет JPanel {личного окончательное C wrappedChart; общественный InteractiveChart () {// ошибка компилятора: в этой точке C может быть любым другим подкласс Chart это (новый SimpleChart ()); } Общественных InteractiveChart (С диаграмма) {wrappedChart = диаграмма; } Общественных С getWrappedChart () {вернуть wrappedChart; }} Как я могу решить эту дилемму между 1 и 2? Мой текущий лучшим решением является создание подкласса InteractiveChart называется InteractiveSimpleChart, что фиксирует общий параметр. Я надеюсь найти способ устранить этот подкласс, так как каждый раз, когда я добавить новый вид диаграммы я должен добавить новую оболочку для интерактивности тоже.
Mark Jeronimus
1

голосов
1

ответ
140

Просмотры

Использование вложенных дженерики в Java

В Vaadin 8.5.1 мы имеем компонент сетки, который имеет этот метод, чтобы добавить новые столбцы к сетке. . Сетка Колонка addColumn (ValueProvider valueProvider) А полные примеры выглядит следующим образом: // Выпей Список данных людей = Arrays.asList (новый Person ( "Коперник", 1543), новый человек ( "Галилео Галилей", 1564) , новое лицо ( "Иоганн Кеплер", 1571)); // Создать сетку привязанной к списку сетка сетке = новая Сетка (); grid.setItems (люди); grid.addColumn (Person :: GetName) .setCaption ( "Name"); grid.addColumn (Person :: getBirthYear) .setCaption ( "Год рождения"); layout.addComponent (сетки); и это работает отлично. Но то, что я сейчас пытаюсь осуществить это, когда класс Person расширяет другой класс, который является общим для большинства объектов. Например: общественный класс NamedClass {... Строка GetName общественности () {возвращение имя; }} Общественного класса Person расширяет NamedClass {... общественного ИНТ getBirthYear () {вернуться год рождения; }} Теперь я хочу сделать вспомогательный класс сетки, который делает grid.addColumn (NamedClass :: GetName) .setCaption ( "Name"); для всех классов потомка, ALS другие свойства обрабатываются мое расширение этого. Я попытался с: класс ANamedGridHelper общественного {общественного Column mapProperties (Сетка сетки) {вернуться grid.addColumn (NamedClass :: GetName) .setId ( "имя"); }} И общественный класс PersonGridHellper {----}, но он не будет компилировать класс ANamedGridHelper орг / aarboard / gridtest1 / ANamedGridHelper.java: [19,19] не подходящий метод нашел для addColumn (NamedClass :: GetName) метод ком .vaadin.ui.Grid.addColumn (java.lang.
André Schild
1

голосов
1

ответ
340

Просмотры

Получить имя класса родового параметра передается машинописи

Как я получить имя класса родовой параметр, переданный образец класса {общественного getTypeName (): пустота {оповещения (T.name) // или предупреждение (новый T () constructor.name.)}} Класс Person {общественный FullName: строка} нового образца (). getTypeName () мне нужно на выходе будет печататься в качестве «лица»?
user581157
1

голосов
0

ответ
27

Просмотры

Как определить протокол с общим типом для NSFetchedResultsController?

Это, как я определяю его сейчас: протокол FetchedResultsControlable {уаг fetchedResultsController: NSFetchedResultsController? {Приготовьтесь}} И что мне нужно сделать, чтобы соответствовать этому протоколу, как это: Var fetchedResultsController: NSFetchedResultsController? вар fetchedResultsController: NSFetchedResultsController? вар fetchedResultsController: NSFetchedResultsController? Как я могу добиться этого? Это, как я буду использовать его. Просто необходимо расширить другой протокол: протокол NotificationsViewModelable: FetchedResultsControlable {уведомления Var: [Notificationable] {получить}} Класс NotificationsViewModel: NotificationsViewModelable {уведомления вар: [Notificationable] {вернуть fetchedResultsController .fetchedObjects ?? []} Вар fetchedResultsController: NSFetchedResultsController? }
1

голосов
0

ответ
74

Просмотры

C # цикл в типах

Этот код не компилировать: общественный класс Component {публичный виртуальный аннулируются Foo (T1 t1) {возвращение; }} Панель общественного класса, где T1: Компонент {риЬИс Vо Bar () {Console.WriteLine ( "Win"); }} Класс MyFormPanel общественности: Панель {Форма общественного класса: Компонент {общественного переопределения недействительным Foo (MyFormPanel t1) {t1.Bar (); }}} Ошибка дается в том, что MyFromPanel.Form не может быть использована в качестве параметра типа Т1, так как не существует неявное ссылочное преобразования из MyFormPanel.Form к компоненту Это кажется запутанным для меня, потому что форма наследует от компонента, где MyFormPanel является Панель. Почему происходит эта ошибка тогда?
Nick
1

голосов
0

ответ
53

Просмотры

В общем обеспечивая сеттер для Украшенного объекта, который хранится в массиве

Я, вероятно, буду об этом в самом сложном пути, но я надеюсь, что я пытаюсь сделать, имею смысл здесь. Предположим, у меня есть некоторый набор не связанных между собой, сгенерированных классов, и я хочу, чтобы украсить их, чтобы создать какой-то общий API. Так что-то вроде: общественного абстрактного класса GeneratedDecorator {частного T генерируется; общественных Т getGenerated () {возврата генерируется; } Общественного недействительными setGenerated (Т генерируется) {this.generated = генерируется; } Общественного абстрактного Строка GetString (); . Общественный статический класс ClassA расширяет GeneratedDecorator {@Override общественности Строка GetString () {вернуться getGenerated () getThisString (); }} Общественного статический класс ClassB расширяет GeneratedDecorator {@Override общественности Строка GetString () {вернуться getGenerated () getADifferentString (). } } } Сейчас, использовать этот новый класс фантазии я просто говорю: GeneratedDecorator.ClassA а = новый GeneratedDecorator.ClassA (); a.setGenerated (myGeneratedInstanceA); a.getString (); Хорошо до сих пор так себе ... но теперь я хочу, чтобы управлять массивом этих декораторов. Так давайте попробуем: общественный абстрактный класс DecoratorBundle {частный статический окончательный Int max_rows = 10; частный T [] расслоение; DecoratorBundle () {расслоение = createBundle (); } Публичная строка GetString (интермедиат индекс) {возвращение расслоение [индекс] .getString (); } Общественных недействительные setRow (??? генерироваться, Int индекс) {// проверяет индекс расслоения, если нуль создать новый экземпляр соответствующего типа и установите расслоение [индекс] = новый экземпляр // вызова setGenerated на экземпляр по индексу} защищен абстрактными T [] createBundle (); общественный статический класс ClassA расширяет DecoratorBundle {@Override защищен GeneratedDecorator.ClassA [] createBundle () {вернуть новый GeneratedDecorator.ClassA [MAX_ROWS]; }} Общественного статический класс ClassB расширяет DecoratorBundle {@Override защищен GeneratedDecorator.ClassB [] createBundle () {вернуть новый GeneratedDecorator.ClassB [MAX_ROWS]; }}} Вот где я застрял ... Я хочу, чтобы это DecoratorBundle иметь setRow (??? генерироваться, INT индекс), где параметр по типу GeneratedDecorator (то есть, GeneratedClassA или GeneratedClassB). Похоже, типа стирания, вероятно, сделать это невозможно, но это было бы очень приятно иметь этот класс DecoratorBundle полностью управлять его расслоение массива. В настоящее время он находится в состоянии создать экземпляр массива, но я хочу каким-то образом для того, чтобы создать новый GeneratedDecorator типа и назначить его в методе setRow. Если я буду об этом совершенно не так, то я хотел бы услышать еще одну идею.
Tim Reddy
1

голосов
1

ответ
41

Просмотры

Функция принятие общих параметров

У меня есть подкласс NSManagedObject. Я использую протокол создать класс «оболочки». В моем контроллере данные могут быть либо: Пункты или Элемент1. Для того, чтобы быть в состоянии использовать свою функцию, я должен добавить протокол ItemInfo к пунктам, но это означает, что я должен добавить Var элементы: Элементы {Самовозврат} в пунктах, которые, кажется, немного излишним. Я попытался создать базовый класс, но это не сработало. Вопрос: Есть ли лучший способ, чтобы моя функция принимает оба элемента и ITEM1 в качестве параметров, как с помощью дженерики? NSManagedObject: класс Предметы: NSManagedObject {@NSManaged Имя вара: String @NSManaged кода Var: строка} Протокол: протокол ItemInfo {вар пункт: Items {получить}} расширение ItemInfo {имя вара: String {вернуться item.name} уага код: String {вернуться item.code}} Wrapper: класс iTEM1: ItemInfo {пусть пункт: Детали инициализации (пункт: Items) {self.item = пункт}} Функция: Func handleItem (пункт: ItemInfo) {печать (item.name) печать (item.code)} Я мог бы использовать: FUNC handleItem ( пункт: Т) {если а = пусть деталь как? Пункты {печать (a.name) печать (a.code)}, если позволить = пункт, как? ItemInfo {печать (a.name) печать (a.code)}} Но это не похоже на правильный путь ...
Henny Lee
1

голосов
1

ответ
59

Просмотры

Ищу письменный родовой DAO, Base Entity менеджер ... для Neo4j

Надеюсь у тебя все хорошо. Я новичок в Graph DB «Neo4j», и я ищу Neo4j JPA родового DAO, как я использовал для MySql БД. Есть ли написано родовое DAO, Base Entity менеджер ... для GraphAPI для Neo4j ??? Благодаря заранее.
Jean Amidi
1

голосов
0

ответ
115

Просмотры

Инстанцирование объектов Realm с использованием генериков в Swift

Я работаю в проекте IOS с участием Realm и использование генериков. Я изучаю пути клонировать полученный объект Realm, чтобы обновить его вне транзакции записи, а затем отправить его в функцию обновления с помощью дженерик. Я столкнулся странные проблемы, и я не знаю, если это связано с Realm или вещи дженериков. Вы помогаете будут оценены Установка: один класс GenericObject, который наследуется от Object Realm и подкласс под названием Продажа: GenericObject: Object Продажа: Generic Object // Этот класс включает в себя первичный ключ, называемый «идентификатор» Я принесу объект продажи из Интернета и Я могу сохранить его в Realm, создавая новый объект за пределами транзакции записи (я мог бы спасти его, не беспокоясь о сделке записи, но я хочу, чтобы использовать тот же код и поток для любого обновления) Когда я изменить свойство объект и попытаться обновить Realm, он бросает исключение, потому что первичный ключ не может быть найден. (The PrimaryKey определен в подклассе продажу) Я был в состоянии точно определить проблему с моим newItem () метод в продажу следующим образом: переопределение функ newItem (OfType ItemType: T.Type) -> T {пусть словарь = self.getDictionary () пусть newItem = T.init () newItem.updateWithDictionary (ДИКТ: словарь) печать ( "Тип: \ (тип (из: newItem)) - объект: \ (newItem)") вернуть newItem} И тогда, я называю это следующим образом: пусть newObject = object.newItem (OfType: Sale.self) self.realm.add (newObject, обновление: правда) до сих пор, так хорошо. Я получить объект из Интернета, и это работает. Печать () сообщает, что тип (из :) в Instantiate объектом является продажей и распечатка объекта также говорит Тип продажи: Продажа - Объект: Продажа {.... Когда я обновить объект и сохранить его, он не говорил, что Realm не мог найти первичный ключ, тип (из отчетов :) продажу, но экземпляр печатается суперкласса GenericObject следующим образом: Тип: Продажа - Объект: GenericObject {.... Этот результат, работает тот же код и тот же выполнение кода. Я использую Xcode 10 и Swift 4.2, с Realm 3 Любая идея, что может быть здесь происходит?
eharo2

Просмотр дополнительных вопросов