这是一个棘手的问题 - 我有一个我想在 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.Any
或 scala.Null
)将静态方法放在那里,但所有实例方法都定义为 抛出新的错误()
。错误消息似乎没有考虑到这种独特的情况。
所以,答案是:不,它不能在 Scala 中实现,据我所知。但它也不能用 Java 实现。即使是微不足道的实现,您在尝试使用它编写代码时也会遇到同样的问题。
关于java - Scala:如何实现包含没有类型参数的 scala "typed"类的 java 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49381139/