Scala: как получить нестертый экземпляр класса с имплицитами без использования asInstanceOf?

У меня есть следующий метод 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] = ???


person Gal    schedule 31.08.2018    source источник
comment
Как бы то ни было, это в основном тот же вопрос, что и этот, для которого единственный ответ - использовать asInstanceOf. Я не понимаю, почему runtimeClass возвращает экзистенциальный тип.   -  person Owen    schedule 03.09.2018
comment
Кроме того, просто замечание по терминологии, это не совсем стертый шрифт; все типы Scala стираются. Это экзистенциальный тип, что означает, что он не дает никаких гарантий относительно того, что такое параметр типа. Я предполагаю, что это означает, что автор runtimeClass, должно быть, подумал, что, возможно, есть некоторые T, для которых classTag[T].runtimeClass.newInstance() даст не T. Однако я не могу представить, что это будет.   -  person Owen    schedule 03.09.2018
comment
@Owen Я использую терминологию, используемую в scala, например, A ClassTag [T] хранит стертый класс заданного типа T (scala-lang.org/api/2.12.3/scala/reflect/ClassTag.html).   -  person Gal    schedule 03.09.2018
comment
Я думаю, это относится к информации времени выполнения, хранящейся ClassTag, то есть ClassTag[List[Int]] хранит информацию о List, но не о Int. Обратите внимание, что даже если в информации о среде выполнения ничего не говорится о Int, статическим типом все равно может быть ClassTag[List[Int]].   -  person Owen    schedule 03.09.2018