Twoja kłótnia jest błędna. Kotlin nie został jeszcze wydany * i Cejlon prostu miał jego pierwsza wersja wydana, a ja zacytuję jedną z rzeczy, to brakuje their announcement:
Więc wybaczcie, ale co realizacja okaże to jest możliwe? W rzeczywistości nie patrzyłem zbytnio na to, co obiecuje Kotlin, ale to, co obiecuje, to właśnie to, co manifesty już dostarczają, ale w przejrzysty sposób.
Ale rozważmy problem opisałeś w swoim pytaniu:
trait Handles[E <: Event] {
def handle(event: E)
}
Tak, przede wszystkim, JVM nie przewiduje żadnego sposobu identyfikacji parametrów typu interfejsy lub klas, więc E
nie może być sprawdzone przez JVM. Można jednak, przechowywanie informacji o tym, co stoi w E
każdego obiektu, który implementuje Handles
, jak można napisać to w Scala:
abstract class Handles[E <: Event : Manifest] {
def handle(event: E)
}
Następnie zobaczymy metodę handle
. Ponownie JVM nie daje możliwości wykorzystania parametrów typu w definicji metody. Jedynym sposobem implementacji jest handle
zaakceptowanie Object
jako parametru: tj. Typ wymazania.
A tutaj jest umowa: aby wywołać handle
z Javy, musi ona być typu wymazana. A jeśli jest to typ wymazany, to podlega ograniczeniom opisanym w pytaniu. Jedynym sposobem na obejście tego jest zniesienie kompatybilności Java (która, nawiasem mówiąc, nie jest dostępna również w pierwszym wydaniu Cejlonu).
Tak, Scala będzie mieć reifikację (pewnego rodzaju) na 2.10, zgodnie z Martin Odersky. Ale cokolwiek to zapewnia (a ja stawiam na bardziej przejrzyste użycie manifestów, aby zapewnić równość typu), to szczególne ograniczenie jest nieodłączne dla JVM i nie da się go pokonać bez zrzucania integracji Java.
(*) Kotlin ma teraz wersję demo, a jej reifikacja - jak dotąd - jest po prostu syntaktycznym cukrem do łączenia manifestów i testów instancji ON. Wciąż podlega tym samym ograniczeniom, co Scala.
Próbowałem zaktualizować pytanie, więc teraz mam nadzieję, że łatwiej jest mu odpowiedzieć r (jak w Tak/Nie nie możesz zaimplementować ogólnej cechy wiele razy w Scali 2.10, ponieważ reifikacja typu będzie wymagać wymieszania nazw w wygenerowanych klasach, co sprawi, że będą skomplikowane w użyciu w Javie. Lub cokolwiek może być odpowiedzią. –
Odersky * powiedział * reifikacja jest w 2.10, więc to więcej niż plotka. – Malvolio
Masz na myśli to, że nie istniejący Kotlin i Cejlon, który został właśnie wydany bez reifikacji, pokazuje, że reifikacja generyków jest możliwa? Jak to działa? –