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

Scala: how to implement a java interface that contains scala "typed" classes without their type parameters

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

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: Array)Unit is not defined
(Note that Array does not match Array[_]. To implement a raw type, use 
Array[_])
class FooImpl extends Foo {

要使代码正常工作,您必须

  • FooImpl 声明为 abstract class

  • 实现bar方法

因为"Java interfaces don’t implement behaviour".

参考 this 页。

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

To implement a raw type, use Array[_]

"Raw type" 是 Java 所称的不带类型参数的泛型类型,例如https://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html 解释了为什么你不应该使用它们,除了与现在非常过时的 pre-Java-5 代码交互。所以如果它是一个选项,你应该首先修复 Java 接口。

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

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