我正在使用一些旧的 Java 库,它们使用集合而不在 Scala 中指定类型参数(例如 Eclipse draw2d)。
假设你有一个像这样的 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 中使用这个类?
最佳答案
那么你可以做的是:
val a = new A
val ls = a.asInstanceOf[java.util.List[Any]]
ls.add(1)
但同样,您将无法使用 A
中的其他方法。我仍然不确定您将如何访问 A
方法。引用资料(在变更日志中说):
A raw type in Java such as ArrayList is translated to ArrayList[_], which is a shorthand for ArrayList[T] forSome { type T }
因此 scala 编译器总是将其视为 A extends ArrayList[E] forSome {type E}
并且不确定如何转义该类型(在编译时)。
关于java - 使用 Java 库的 Scala 不指定集合的类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19064324/