我正在使用一些旧的
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},并且不确定如何转义类型(在编译时).