4

Scala で型パラメータを指定しないコレクション (Eclipse draw2d など) を使用する古い Java ライブラリを使用しています。

次のような Java クラス (変更できない) があるとします。

// A.java
package com.example.test;
import java.util.ArrayList;

public class A extends ArrayList {}  // not ArrayList<Object>, just ArrayList

Java でクラス A を操作する場合は、次のようにします。

// B.java
import com.example.test.A;

public class B {
  public static void main(String[] args) {
    A a = new A();
    a.add(1);
  }
}

javac B.javaいくつかの警告で成功します:

Note: C.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

ただし、Scala で同じことは不可能です。

// C.scala
import com.example.test.A

object C {
  def main(args: Array[String]): Unit = {
    val a = new A()
    a.add(1)
  }
}

scalac C.scalaエラーを出す:

C.scala:6: error: type mismatch;
 found   : Int(1)
 required: E
    a.add(1)
          ^

このクラスを Scala で使用するにはどうすればよいですか?

4

2 に答える 2

1

私は解決策を見つけました:

// C.scala
import com.example.test.A
import java.util.ArrayList

object C {
  def main(args: Array[String]): Unit = {
    val a = new A()
    a.asInstanceOf[ArrayList[Any]].add(1)    // a.add(1)
    println(a.size())
  }
}

このコードは問題を解決しました!

しかしArrayList[Nothing] -> ArrayList[Any]、Scala でどのように変換が可能なのか疑問に思っていますが、whileArrayは不変です。さらに、Scala はArrayList[Any] -> ArrayList[Nothing]変換も受け入れます。

于 2013-09-28T08:09:21.237 に答える
1

あなたができることは次のとおりです。

val a = new A
val ls = a.asInstanceOf[java.util.List[Any]]
ls.add(1)

ただし、 から他のメソッドを使用することはできませんA。メソッドにアクセスする方法についてはまだわかりませんA。参照(変更ログに記載):

ArrayList などの Java の生の型は、ArrayList[_] に変換されます。これは、ArrayList[T] forSome { type T } の短縮形です。

そのため、scala コンパイラは常にそれを受け取りA extends ArrayList[E] forSome {type E}、型を (コンパイル時に) どのようにエスケープできるかについて確信が持てません。

于 2013-09-28T08:10:17.287 に答える