Я хочу создать функцию, которая возвращает представление времени выполнения подклассов Scala, которые имеют один и тот же суперкласс, используя classOf
, например.
class C
class C0 extends C
class C1 extends C
def f(i: Int): Class[C] = {
if (i % 2 == 0) classOf[C0]
else classOf[C1]
}
Однако возвращаемые значения classOf[Cn]
дают мне ошибку Выражение типа classOf[Cn] не соответствует ожидаемому типу Class[C], создавая впечатление, что информация о наследовании потеряна в Class[T]
.
Я думаю, что ClassTag
может как-то помочь сохранить стертый шрифт, но как?
Class[A]
инвариантен в A
. Это означает, что Class[C1]
является нет подтипом Class[C]
, хотя C1
является подтипом C
.
Вы можете переписать возвращаемый тип на экзистенциальный тип Class[_ <: C]
, чтобы указать, что вы знаете, что его параметр типа будет подтипом C
, но вы не знаете, какой именно.
def f(i: Int): Class[_ <: C] = {
if (i % 2 == 0) classOf[C0]
else classOf[C1]
}
Я подозреваю (но не уверен на 100% прямо сейчас), что имело бы смысл, чтобы Class
был ковариантным, но Class
определено в Java, где общие классы все (кроме специальных массивов) инвариантны.