Ваш аргумент неверен. Kotlin еще не был выпущен *, и Ceylon только что выпустил свою первую версию, и я процитирую одну из вещей, которых он пропускает в их объявлении :
- усовершенствованные дженерики
Итак, извините, но какая реализация доказывает, что это возможно? На самом деле, я не особо задумывался над тем, что обещает Котлин, но то, что обещает Цейлон , - это именно то, что манифесты уже предоставляют, но в прозрачной форме.
Но давайте рассмотрим проблему, которую вы описали в своем вопросе:
trait Handles[E <: Event] {
def handle(event: E)
}
Итак, во-первых, JVM не предоставляет никакого способа определения параметров типа в интерфейсах или классах, поэтому E
не может быть проверен JVM . Однако вы можете хранить информацию о том, что означает E
в каждом объекте, который реализует Handles
, так же, как вы могли бы написать это в Scala:
abstract class Handles[E <: Event : Manifest] {
def handle(event: E)
}
Далее, давайте посмотрим на метод handle
. Опять же, JVM не позволяет использовать параметры типа в определении метода. Единственный способ реализовать это состоит в том, чтобы handle
принять Object
в качестве параметра: т. Е. Тип стирания.
И вот в чем дело: чтобы сделать handle
вызываемым из Java, его необходимо стереть. И, если это стирается тип, то это подлежит ограничению, описанному в вашем вопросе. Единственный способ обойти это - отказаться от совместимости с Java (что, кстати, недоступно и в первом выпуске Ceylon).
Да, по словам Мартина Одерского, у Scala будет 2-й вариант (какой-то степени) 2 октября. Но что бы это ни обеспечивало (и я ставлю на более прозрачное использование манифестов для утверждения равенства типов), это конкретное ограничение присуще JVM и не может быть преодолено без отказа от интеграции Java.
(*) У Kotlin сейчас есть демоверсия, и его реализация - пока что - просто синтаксический сахар для объединения манифестов и экземпляров тестов. Это все еще подчиняется тем же ограничениям, что и Scala.