8

2.10にアップグレードしている存在型を使用するScalaコードがいくつかありますが、「import language.existentials」を追加することについての警告に気づきました。これにより、これを記述するためのより良い方法があるはずだと思います。私が持っているコードは要約すると次のようになります。

class A {
  private var values = Set.empty[(Class[_], String)]
  def add(klass: Class[_], id: String) {
    val key = (klass, id)
    if (!values(key)) {
      values += key
      // More logic below..
    }
  }

この警告が表示されます:

[warn] test.scala:4 inferred existential type (Class[_$2], String) forSome { type _$2 }, which cannot be expressed by wildcards, should be enabled
[warn] by making the implicit value language.existentials visible.
[warn] This can be achieved by adding the import clause 'import language.existentials'
[warn] or by setting the compiler option -language:existentials.
[warn] See the Scala docs for value scala.language.existentials for a discussion
[warn] why the feature should be explicitly enabled.
[warn]       val key = (klass, id)

この警告を生成しない(またはインポートを必要としない)コードを書き直す方法はありますか、それともそれを表現する最も慣用的な方法ですか?コード内のどこでも、Classの型パラメーターについて質問することはありません。

4

2 に答える 2

9

警告は、通常は望ましくない存在型の推論に関するものです。import ステートメントを追加するか、明示的にします。

val key: (Class[_], String) = (klass, id)
于 2012-06-13T22:19:15.390 に答える
4

add メソッドに型パラメーターを指定すると、警告は消えます。これは、var 値に格納できるものには影響しません。理由については良い答えがありませんが、回避策です。うまくいけば、より有能な誰かが説明で応答することもできます.

  class A {
    private var values = Set.empty[(Class[_], String)]

    def add[T](klass: Class[T], id: String) {
      val key = (klass, id)
      if (!values(key)) {
        values += key
        // More logic below..
      }
    }
  }
于 2012-06-13T21:10:11.757 に答える