Scala 结构类型细化和类型相等

Scala 结构类型细化和类型相等,scala,reflection,structural-typing,Scala,Reflection,Structural Typing,我无意中发现了类型的一个令人费解的行为。=:=当应用于类型补考时。 考虑: 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是类型细化的别名,我希望

我无意中发现了
类型的一个令人费解的行为。=:=
当应用于类型补考时。 考虑:

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[T1]+1,以便将我指向相关的bug)。但我不确定这是否是我遇到的错误。SI-8177是关于依赖类型和类型前缀的无效处理。我认为这会影响上述代码段的唯一方式是因为我的类型别名具有不同的前缀。在REPL中确实如此,但我尝试将所有定义包装到同一个对象中(=>相同的前缀)并且我仍然得到相同的错误。尽管修复SI-8177可能会作为副作用修复我的问题。当2.11.0-RC1失效时,我将尝试使用它,如果修复了,我将验证您的答案。好的,scala 2.11.0-RC1刚刚发布,所以我尝试使用它(因为SI-8177在scala 2.11.0-RC1中标记为修复)。错误肯定仍然存在,因此我怀疑SI-8177没有涵盖我描述的问题。也许是时候开罚单了。