K reifikaci: ve Scale jde něco podobného pomocí implicitních parametrů typu Manifest[T]. Na první pohled to sice vypadá krypticky, ale dá se na to zvyknout.
Manifesty dělají skoro přesně to, co jsem měl na mysli. Skoro. Hlavní síla reifikace je, že mám v runtime dostupné hodnoty typových parametrů. Manifest doplní hodnotu typového parametru staticky v době kompilace. Z dostupných statických informací, nemusí reflekovat skutečný runtime typ. V nejlepším případě bude, v horších případech bude vracet předky skutečných typů.
`class X[T: Manifest](v: T) { val m = manifest[T] }`
`val t: Any = 1`
`val x = new X(t)`
v6ak(2011-05-16 07:19)
Tady jsem nepochopil, jak chceš získat něco přesnějšího. Chci-li znát typ z času kompilace, funguje to dobře. A chci-li znát skutečný typ, mám tu getClass, přičemž erasure mi nevadí. Jo, pokud chci znát nějaký typový parametr typového parametru (mám např. A[B[C]] a z A chci zjistit C), pak mi to musí poskytnout třída C, nestačí-li mi znát hodnotu při kompilaci a nemohu-li se spolehnout na nějakou runtime hodnotu.
Co se týče integrace do jazyka, souhlas. Mohlo by to tam být zakomponováno lépe. Ale: * Pro občasné použití (můj případ) to bohatě stačí. * Princip tu je, v budoucnu to půjde vylepšit.