java - Scala:如何实现包含没有类型参数的 scala "typed"类的 java 接口(interface)

标签 java scala scala-java-interop

这是一个棘手的问题 - 我有一个我想在 scala 中实现的 java 接口(interface):

public interface Foo {
  public void bar(scala.Array arr);
}

甚至可以在 scala 中实现吗?当我尝试时:

class FooImpl extends Foo {
  override def bar(arr: Array[_]): Unit = ???
}

我得到:

Error:(13, 7) class FooImpl needs to be abstract, since method bar 
in trait Foo of type (x$1: Array)Unit is not defined
(Note that Array does not match Array[_]. To implement a raw type, use 
Array[_])
class FooImpl extends Foo {

最佳答案

错误消息为您提供了除 Array 之外的任何泛型类型的答案(当然是在替换名称之后):

To implement a raw type, use Array[_]

“原始类型”是 Java 所说的没有类型参数的泛型类型,例如https://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html解释了为什么你不应该使用它们,除了与现在非常过时的 Java-5 之前的代码交互。因此,如果可以的话,您应该首先修复 Java 接口(interface)。

现在,为什么这对 Array 不起作用?它是一种特殊类型,真正内置于编译器中。它的实例是真正的 JVM 数组,在 Java 中没有通用类型。所以当它在 Scala 代码中使用时,编译后的字节码根本不使用 scala.Array。我猜它只作为 JVM 类型存在(不像 scala.Anyscala.Null)将静态方法放在那里,但所有实例方法都定义为 抛出新的错误()。错误消息似乎没有考虑到这种独特的情况。

所以,答案是:不,它不能在 Scala 中实现,据我所知。但它也不能用 Java 实现。即使是微不足道的实现,您在尝试使用它编写代码时也会遇到同样的问题

关于java - Scala:如何实现包含没有类型参数的 scala "typed"类的 java 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49381139/

相关文章:

java - java中这两种调用静态变量的区别

java - 我在我的应用程序中嵌入了 jetty 以通过 websocket 进行通信,如何定义不同的路径?

scala - list 和抽象类型解析

scala - 如何获取数据框中每一行每一列的值和类型?

java - Scala 对象在 Java 中的等价物是什么?

java - 如何在 Java 代码中使用 Scala 可变参数

java - 从给定的 url 中提取主域名

java - 在 spring mvc 中将文件名传递给 Controller

scala - 如何使 sbt 输出详细日志信息

java - 在 Java 中捕获 Scala 中抛出的异常 - 无法访问的 catch block