Иногда я получаю противоречивый результат, когда проверяю, расширяет ли класс черту. Я использую scala 2.12.8.
Мой проект использует ru.Type
для динамического построения цепочки операций. Вывод операции должен соответствовать вводу следующей.
Прежде чем связать две операции, я проверяю, совместим ли тип, используя:
def checkFrom(t: ru.Type): Boolean = t <:< ru.typeOf[ExpectedTrait[_, _, _]]
Но иногда (на самом деле редко) <:<
возвращает false вместо true (я не определил причину)
Я добавил отладочное сообщение:
def checkFrom(t: ru.Type): Boolean = {
val expectedType = ru.typeOf[ExpectedTrait[_, _, _]]
val r = t <:< expectedType
if (!r) println(s"$t is not a $expectedType (${t <:< expectedType})")
r
}
Я вижу сообщение вроде: MyClass is not a ExpectedTrait (true)
.
Первая оценка <:<
возвращает false, а вторая возвращает true!
t является Types$ClassNoArtgsTypeRef
, а ожидаемый тип является Types$ExistentialType
- редактировать -
Все ru.Type происходят от ru.typeOf[X]
. В этом случае я не использую rm.classSymbol(x.getClass).toType
.
Эта проблема, вероятно, связана с несоответствием с библиотекой scala-отражением
Существует ли обходной путь?