【发布时间】:2016-06-03 08:10:17
【问题描述】:
在 Scala 中使用存在类型时,编译器似乎将存在的每个用法推断为不同的类型参数,即使它们实际上是相同的。
对于一个简单的人为示例 - 给出以下代码
class Box[T](value:T){
def get:T = value
def contains(check:T):Boolean = value == check
}
我可以做到以下几点
val b1 = new Box(1)
b1.contains(b1.get)
但是当使用存在类型时...
val b2 : Box[_] = new Box(1)
b2.contains(b2.get)
我收到以下错误(在 scala 2.11.7 中
[error] /private/tmp/exttest/test.scala:53: type mismatch;
[error] found : (some other)_$6(in value b2)
[error] required: _$6(in value b2)
[error] b2.contains(b2.get)
我的假设是编译器会理解在两种情况下都使用相同的类型参数_$6,但是它似乎迷失了方向并将它们视为单独的类型。
我是否从根本上误解了存在类型,或者这是 Scala 编译器中的错误 - 如果是,是否有解决它的最佳实践?
【问题讨论】:
标签: scala generics type-inference existential-type