Ответ 1
Ваш аргумент неверен. Kotlin еще не выпущен *, и Ceylon только что выпустил свою первую версию, и я приведу одну из вещей, которые она отсутствует в их объявлении:
- reified generics
Итак, извините, но какая реализация доказывает, что это возможно? На самом деле, я не очень много смотрю на то, что Котлин обещает, но то, что Цейлон многообещающе, - это то, что уже проявляются, но прозрачным образом.
Но рассмотрим проблему, которую вы описали в своем вопросе:
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
в качестве параметра: ie, type erasure.
И вот сделка: чтобы сделать handle
вызываемым с Java, он должен быть стираться. И, если тип стирается, тогда это подлежит ограничению, описанному в вашем вопросе. Единственный способ обойти это - отказаться от совместимости с Java (которая, кстати, недоступна и в первой версии Ceylon).
Да, Scala будет охарактеризовать (что-то вроде) на 2.10, по словам Мартина Одерского. Но независимо от того, что он предоставляет (и я делаю ставку на более прозрачное использование манифестов для утверждения равенства типов), это конкретное ограничение является неотъемлемой частью JVM и не может быть преодолено без потери интеграции Java.
(*) Теперь у Kotlin есть демоверсия, и ее reification - до сих пор - это просто синтаксический сахар для связывания манифеста и тестов instanceOf. Он по-прежнему подвержен тем же ограничениям Scala.