Ниже представлена идеальная конструкция на C++, C# и других подобных языках. Почему это невозможно в Котлине
open class EndPoint<T> (url: String): T{
...
}
class BlueEndPoint: EndPoint<BlueInterface>{}
class RedEndPoint: EndPoint<RedInterface>{}


Это вызвано ограничениями дженериков JVM. Более подробную информацию вы можете прочитать [здесь] (https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html).
Потому что 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++.
Я не использую производный класс в качестве параметра. Общий параметр - это определенный класс интерфейсов. Я думаю, вы путаете это с милым под названием "Любопытно повторяющийся шаблон шаблона"
Думаю, это вы сбиваете с толку: : T - это именно то, что запрещает цитируемая строка, в то время как CRTP отлично работает на C#, Java и Kotlin.
Я добавил еще один абзац, который может прояснить проблему.
Что из этого будет?