假设,我们有一个带有抽象类型字段的抽象类:
abstract class A {type T}
现在假设,我们有一个方法,它返回 type 的对象A
,但 type 字段T
可能不同。我们如何区分这些对象?
我们可以尝试模式匹配:
object Test {
def tryToDistinguish(a: A) =
a match {
case b: A {type T = String} => println("String type")
case b: A {type T = Int} => println("Int type")
case b: A => println("Other type")
}
}
但是编译器会抱怨:
$>scalac -unchecked Test.scala
Test.scala:8: warning: refinement example.test.A{type T = String} in type patter
n example.test.A{type T = String} is unchecked since it is eliminated by erasure
case b: A {type T = String} => println("String type")
^
Test.scala:9: warning: refinement example.test.A{type T = Int} in type pattern e
xample.test.A{type T = Int} is unchecked since it is eliminated by erasure
case b: A {type T = Int} => println("Int type")
^
two warnings found
似乎类型字段的类型将被擦除(附带问题:因为类型字段被转换为 Java 中的参数类型?)
因此,这将不起作用:
scala> Test.tryToDistinguish(new A {type T = Int})
String type
替代方案:我们可以创建一个枚举并在类A
中放置一个附加字段以区分对象。但这很奇怪,因为这意味着我们重新实现了类型系统。
问题:有没有办法在类型字段的帮助下区分对象的类型?如果没有,什么是好的解决方法?