Почему этот код невозможен в Котлине?

Ниже представлена ​​идеальная конструкция на C++, C# и других подобных языках. Почему это невозможно в Котлине

open class EndPoint<T> (url: String): T{

...
}

class BlueEndPoint: EndPoint<BlueInterface>{}
class RedEndPoint: EndPoint<RedInterface>{}
Повышение качества Laravel с помощью принципов SOLID: Лучшие практики и примеры
Повышение качества Laravel с помощью принципов SOLID: Лучшие практики и примеры
Когда мы говорим о том, как сделать следующий шаг в качестве разработчика, мы должны понимать, что качество кода всегда является основным фокусом на...
Принципы SOLID - лучшие практики
Принципы SOLID - лучшие практики
SOLID - это аббревиатура, обозначающая пять ключевых принципов проектирования: принцип единой ответственности, принцип "открыто-закрыто", принцип...
1
0
260
2

Ответы 2

Это вызвано ограничениями дженериков JVM. Более подробную информацию вы можете прочитать [здесь] (https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html).

Что из этого будет?

Alper 14.05.2018 13:28

Потому что Kotlin использует универсальные шаблоны, а не шаблоны. Он имеет только один класс EndPoint вместо того, чтобы создавать новый для каждого T, как это делает C++.

А на JVM этот класс должен расширять ровно один суперкласс (возможно, Object) и определенный набор интерфейсов (возможно, ни одного). Т.е. у вас не может быть EndPoint<BlueInterface>, реализующего BlueInterface, но не RedInterface, и наоборот для EndPoint<RedInterface>.

Согласно MSDN, он также не работает на C# (я считаю, что CLR имеет такое же требование при определении классов):

C# does not allow the type parameter to be used as the base class for the generic type.

Исключение составляет C++.

Я не использую производный класс в качестве параметра. Общий параметр - это определенный класс интерфейсов. Я думаю, вы путаете это с милым под названием "Любопытно повторяющийся шаблон шаблона"

Simple Fellow 14.05.2018 13:22

Думаю, это вы сбиваете с толку: : T - это именно то, что запрещает цитируемая строка, в то время как CRTP отлично работает на C#, Java и Kotlin.

Alexey Romanov 14.05.2018 13:29

Я добавил еще один абзац, который может прояснить проблему.

Alexey Romanov 14.05.2018 13:44

Другие вопросы по теме