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問題は、タイプが一致していることですStack[String]。実行時にsis が typeかどうかを判断することはできますStackが、Java の型消去sのため、 is が typeなどStack[String]であるかどうかを判断することはできません。これが、Scala が警告を発行する理由です。のように合わせても同じです。Stack[Int]case

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 に答える