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

标签 java scala generics

我正在使用一些旧的 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/

相关文章:

scala - java.lang.NumberFormatException : For input string: "|" 异常

java - Scala 泛型未在 IntelliJ 中正确转换为 Java

c# - 使用泛型装箱和拆箱

java - 如何使 Jbutton 周围的边框变粗?

java - 找不到用于重命名的 Eclipse 快捷方式

java - AS/400 中未找到类错误

java - 集合<字符串>

scala - akka http 自定义嵌套指令

scala - AnyRef 的奇怪模式匹配行为

c++ - 如何为表达式解析器的派生类对象设置和取消引用通用指针?