结构类型细化和类型相等

时间:2014-02-07 13:59:22

标签: scala reflection structural-typing

我偶然发现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时相同的类型。

或者换句话说,我希望T1T2表示完全等效的类型。

在大多数情况下,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?

1 个答案:

答案 0 :(得分:4)

可悲的是,它似乎是这个错误:https://issues.scala-lang.org/browse/SI-8177

从好的方面来看......看起来正在积极开展工作以解决问题:)