Я наткнулся на загадочное поведение 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
обозначают полностью эквивалентные типы.
По большей части, scalac, кажется, согласен. Например, я могу передать экземпляр 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 я получаю совершенно другие результаты:
scala> typeOf[T1] =:= typeOf[T2]
res2: Boolean = false
Так это ошибка отражения scala (я так думаю) или есть фундаментальная причина (техническая или иная), почему typeOf[T1] =:= typeOf[T2]
возвращает false?
typeOf[T1] <:< typeOf[T2]
и наоборот тоже верно. - person som-snytt   schedule 07.02.2014(typeOf[T1] <:< typeOf[T2]) && (typeOf[T2] <:< typeOf[T1])
. Очевидно, что это все еще похоже на взлом, хотя - person Régis Jean-Gilles   schedule 07.02.2014