Size: a a a

2020 April 25

NR

Nikita Rudy in KotlinLangRu
источник

ch

central hardware in KotlinLangRu
Nikita Rudy
Господа, столкнулся с такой проблемой, буду благодарен если кто подскажет:

Есть вот такой код
https://gist.github.com/MelonCode/3fd6d6ad76a20578754ffcc446282ba6

Когда регистрирую в EntityProducer "стандартную" DefaultFactory, обобщенные типы которой полностью совпадают с объявленными, то не возникает никаких проблем
Но когда я пытаюсь зарегистрировать HeroFactory, то получаю ошибку со скриншота ниже

Player в свою очередь является наследником Entity, а Hero наследником ECSEntity
у вас HeroFactory должен быть наследником GenericFactory
источник

QH

Quantum Harmonizer in KotlinLangRu
он и есть, через тайпалиас
источник

NR

Nikita Rudy in KotlinLangRu
Как правильно объявить дженерики у EntityTypeFactory чтобы можно было передавать наследников EntityTypeFactory у которых типы в дженериках являются наследниками типов в дженериках в базовом классе?
источник

QH

Quantum Harmonizer in KotlinLangRu
EntityTypeFactory<Entity, ECSEntity> — это такой EntityTypeFactory, у которого T строго равно Entity, U строго равно ECSEntity.
Чтобы сделать нестрогое равенство, смотри variance.
источник

NR

Nikita Rudy in KotlinLangRu
Я пробовал вариант когда типы объявляются как
EntityTypeFactory<out Entity, out ECSEntity>
источник

NR

Nikita Rudy in KotlinLangRu
В таком случае удается зарегистрировать HeroFactory, однако появляется вот такая проблема, причину которой я до конца не понял
источник

NR

Nikita Rudy in KotlinLangRu
источник

QH

Quantum Harmonizer in KotlinLangRu
EntityTypeFactory<in Entity, out ECSEntity>
источник

NR

Nikita Rudy in KotlinLangRu
Пробовал использовать in Entity, out ECSEntity, но возвращается изначальная ошибка отсюда
источник

NR

Nikita Rudy in KotlinLangRu
источник

NR

Nikita Rudy in KotlinLangRu
Набросал минимальный воспроизводимый кейс
https://pl.kotl.in/Bjy0aobzG
источник

QH

Quantum Harmonizer in KotlinLangRu
Nikita Rudy
Набросал минимальный воспроизводимый кейс
https://pl.kotl.in/Bjy0aobzG
EntityFactory<Pork, Pig> не является подтипом EntityFactory<Input, Output>:
EntityFactory<*, Output> — действительно общий надтип всех фактори,
но EntityFactory<Input, *> — наоборот, очень узкий тип, из-за in variance.
источник

QH

Quantum Harmonizer in KotlinLangRu
Если бы этой ошибки не было и можно было скастить EntityFactory<Pork, Pig> в EntityFactory<Input, Output>, то в фабрику можно было бы передать не только Pork, но и любой другой Input, а это небезопасно.
источник

NR

Nikita Rudy in KotlinLangRu
Аааа..
источник

NR

Nikita Rudy in KotlinLangRu
Имеет смысл
источник

NR

Nikita Rudy in KotlinLangRu
То есть желаемое мной по факту осуществить невозможно тут?
источник

NR

Nikita Rudy in KotlinLangRu
Не нарушая безопасности
источник

QH

Quantum Harmonizer in KotlinLangRu
думаю, невозможно
источник

NR

Nikita Rudy in KotlinLangRu
То есть, кратко говоря, самым оптимальным в моем случае вариантом будет являться отказ от первого генерика и ограничиться базовым типом на функцию create?
источник