0

可能重复:
如何绕过 Scala 上的类型擦除?或者,为什么我不能获取我的集合的类型参数?

我运行了以下代码:

scala>  var s = new Stack()push(1)
s: scalatest.Stack[Int] = 1 

scala>  s match { case s : Stack[String] => print("Hello")}
<console>:12: warning: non variable type-argument String in type pattern scalatest.Stack[String] is unchecked since it is eliminated by erasure
              s match { case s : Stack[String] => print("Hello")
}

Stack 是取自http://www.scala-lang.org/node/129的类。如果我在没有-unchecked标志的情况下运行此代码,它将打印“Hello”。为什么会这样?

4

1 回答 1

2

问题是你匹配s的是 type Stack[String]。在运行时,可以确定 if sis of type Stack,但由于 Java 的类型擦除,无法确定 if sis of typeStack[String]Stack[Int]。所以无论类型参数是什么,它都会被case表达式匹配。这就是 Scala 发出警告的原因。就像你匹配一样

s match { case s : Stack[_] => print("Hello")}

(这将在没有警告的情况下编译)。


编辑:一种解决方法(也适用于 Java)是创建一个不再具有类型参数的特定类。例如:

import scala.collection.mutable.Stack;

object Test extends App {
  class MyStack extends Stack[Int];
  class MyOtherStack extends Stack[String];

  val s: Stack[_] = new MyStack().push(1);

  s match {
    case s : MyOtherStack => print("Hello String");
    case s : MyStack => print("Hello Int");
  }
}

它有一个缺点,您不能将它用于不可变容器,因为它们的方法会创建新对象,并且它们不会是这些特定子类的实例。

于 2012-08-16T11:26:09.213 回答