【发布时间】:2014-02-07 13:59:21
【问题描述】:
当应用于类型改进时,我偶然发现了 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 进一步细化它会
产生与我在 Base 中定义 foo 相同的类型。
或者换句话说,我希望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]反之亦然。 -
这是一个很好的观察。至少有一些的一致性。另一个很棒的事情是,它至少为我提供了一种解决方法:我可以测试
(typeOf[T1] <:< typeOf[T2]) && (typeOf[T2] <:< typeOf[T1])。显然,这仍然感觉像是一个黑客攻击
标签: scala reflection structural-typing