Вы не можете из-за типа erasure. Тем не менее, я бы сказал, что ваша попытка сделать это сформирована из неправильного понимания.
- Точка системы типа предназначена для того, чтобы компилятор мог более разумно рассуждать о правильности вашей программы.
- В системе статического типа, каждая ссылка имеет тип, который не может быть изменен
В вашей программе есть одна ссылка, a
и тип этой ссылки является ClassWithTypeParameter[S]
. Что. Является. Все. Компилятор может знать, что можно сделать с этой ссылкой. Типы существуют только для компилятора. Тот факт, что в время выполнения, a
было присвоено значению, которое было ClassWithTypeParameter[A]
, не имеет значения.
Один из возможных способов сделать это в некотором приближении (ограничено стиранием) заключается в использовании проявляется (называется что-то еще в 2.10):
class ClassWithTypeParameter[+T: Manifest] { def erasure = manifest[T].erasure }
Тогда вы можете позвонить erasure
, который вы получите java.lang.Class
назад. Как я уже сказал, это ограничено. класс это не то же самое, как типа и нет никакого способа отличить, например, ClassWithTypeParameter[List[Int]]
от ClassWithTypeParameter[List[Double]]
Но можно используйте манифесты, чтобы различать «CWTP [List [Int]]» и «CWTP [List [Double]]» - просто не удаляйте стирание. –
@oxbow_lakes Спасибо за ваше объяснение, это очень помогло. –