У меня есть следующий метод Java:
public <T> void foo(Class<T> parentClass, Class<? extends T> childClass);
Я попытался использовать неявный ClassTag для вызова вышеуказанного метода, но, к сожалению, методы runtime
возвращают стертый класс, то есть Class[_]
, что означает, что следующий код не будет работать:
import scala.reflect.classTag
def bar[A: ClassTag, B <: A : ClassTag] = foo(classTag[A].runtimeClass, classTag[B].runtimeclass)
Я могу обойти это, используя asInstanceOf
, но мне было интересно, есть ли более чистое решение. Мне кажется очень странным, что в стандартной библиотеке нет метода, возвращающего не стертое значение Class
из ClassTag
.
Для ясности, я ищу существующий метод (в классе ClassTag
или где-то еще) со следующей подписью:
def unerasedRuntimeClass[A: ClassTag]: Class[A] = ???
asInstanceOf
. Я не понимаю, почемуruntimeClass
возвращает экзистенциальный тип. - person Owen   schedule 03.09.2018runtimeClass
, должно быть, подумал, что, возможно, есть некоторыеT
, для которыхclassTag[T].runtimeClass.newInstance()
даст неT
. Однако я не могу представить, что это будет. - person Owen   schedule 03.09.2018ClassTag
, то естьClassTag[List[Int]]
хранит информацию оList
, но не оInt
. Обратите внимание, что даже если в информации о среде выполнения ничего не говорится оInt
, статическим типом все равно может бытьClassTag[List[Int]]
. - person Owen   schedule 03.09.2018