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.Any
或 scala.Null
)将静态方法放在那里,但所有实例方法都定义为 throw new Error()
。错误消息似乎没有考虑到这种特殊情况。
所以,答案是:不,据我所知,它不能在 Scala 中实现。但是也不能在Java中实现non-trivially。即使是微不足道的实现,您在尝试使用编写代码时运行也会遇到同样的问题。
这是一个棘手的问题 - 我有一个 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.Any
或 scala.Null
)将静态方法放在那里,但所有实例方法都定义为 throw new Error()
。错误消息似乎没有考虑到这种特殊情况。
所以,答案是:不,据我所知,它不能在 Scala 中实现。但是也不能在Java中实现non-trivially。即使是微不足道的实现,您在尝试使用编写代码时运行也会遇到同样的问题。