Я наткнулся на недоумение поведения Type.=:=
при применении на типе рефинансирования. Рассмотрим:Уточнение структурного типа и равенство типов
import reflect.runtime.universe._
type T1 = AnyRef {
def apply(name: String): Unit
def foo: String
}
type Base = { def apply(name: String): Unit }
type T2 = Base {
def foo: String
}
Учитывая, что Base
является псевдонимом для типа уточнения, я бы ожидал, что его совершенствования путем добавления элемента foo
бы выход такого же типа, как если бы я определил foo
прямо в Base
.
Или, другими словами, я ожидал бы, что T1
и T2
обозначают полностью эквивалентные типы.
По большей части, скалак, похоже, согласен. К примеру, я могу передать экземпляр T2
, где, как ожидается, экземпляр T1
:
def f(x: T1){}
f(null: T2) // scalac does not complain here
И наоборот:
def g(x: T2){}
g(null: T1) // scalac is still happy
Я также могу попросить свидетельство T1 =:= T2
и компилирует тоже хорошо:
implicitly[T1 =:= T2]
Однако, используя scala reflection I ge т совершенно разные результаты:
scala> typeOf[T1] =:= typeOf[T2]
res2: Boolean = false
Так это отражение ошибка Scala (я так думаю), или есть фундаментальная причина (техническая в противном случае), почему typeOf[T1] =:= typeOf[T2]
возвратит ложь?
'TYPEOF [T1] <:
Это замечательное наблюдение. По крайней мере, существует некоторая * согласованность. Другое замечательно, что, по крайней мере, это дает мне обходной путь: я могу просто проверить для '(typeOf [T1] <: