Scala使用Java库而不指定集合的​​类型参数

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

点赞