Непоследовательный результат при проверке подтипа типа - PullRequest
0 голосов
/ 02 июля 2019

Иногда я получаю противоречивый результат, когда проверяю, расширяет ли класс черту. Я использую 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-отражением

Существует ли обходной путь?

...