6

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会产生与我fooBase.

或者换句话说,我会期望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?

4

1 回答 1

4

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

从好的方面来说......看起来正在积极进行修复它的工作:)

于 2014-02-07T17:09:05.330 回答