あなたの議論には欠陥があります。Kotlin はまだリリースされておらず*、Ceylon は最初のバージョンがリリースされたばかりです。発表に欠けているものの 1 つを引用します。
では、すみませんが、それが可能であることを証明する実装は何ですか? 実際、私は Kotlin が何を約束しているのかについてはあまり調べていませんが、Ceylonが約束しているのは、マニフェストが既に提供しているものですが、透過的な方法です。
しかし、あなたの質問で説明した問題を考えてみましょう:
trait Handles[E <: Event] {
def handle(event: E)
}
したがって、まず第一に、JVM はインターフェイスまたはクラスの型パラメーターを識別する方法を提供しないため、JVMでチェックするE
ことはできません。ただし、 Scala で次のように記述できるように、E
を実装する各オブジェクトに何を表すかに関する情報を格納できます。Handles
abstract class Handles[E <: Event : Manifest] {
def handle(event: E)
}
次に、メソッドを見てみましょうhandle
。繰り返しになりますが、JVM にはメソッド定義で型パラメーターを使用する方法がありません。これを実装する唯一の方法は、パラメーターとしてhandle
受け入れることObject
です。つまり、型消去です。
Java から呼び出し可能にするhandle
には、型を消去する必要があります。また、タイプが消去されている場合は、質問に記載されている制限の対象となります。これを回避する唯一の方法は、Java との互換性をなくすことです (ちなみに、これは Ceylon の最初のリリースでも利用できません)。
はい、Martin Odersky によると、Scala は 2.10 で (何らかの形で) 具体化されます。しかし、それが提供するものは何でも (そして、私は型の等価性を主張するためにマニフェストをより透過的に使用することに賭けています)、この特定の制限は JVM に固有のものであり、Java 統合を中止せずに克服することはできません。
(*) Kotlin には現在デモがあり、その具体化 (これまでのところ) は、マニフェストと instanceOf テストをバンドルするための構文糖衣にすぎません。Scala と同じ制限がすべて適用されます。