【问题标题】:Scala: how to implement a java interface that contains scala "typed" classes without their type parametersScala:如何实现包含没有类型参数的scala“类型化”类的java接口
【发布时间】:2018-03-21 16:46:30
【问题描述】:

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

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 {

【问题讨论】:

    标签: java scala scala-java-interop


    【解决方案1】:

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

    要实现原始类型,请使用Array[_]

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

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

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

    【讨论】:

    • 我无法更改界面的代码,所以这不是一个选项。
    • 据我了解 scala.Array 只是一个示例,它不适用于任何 rawTyped scala 类。
    • 不,对于其他类型,它应该可以工作,如错误消息所述。如果泛型类型有边界,请参阅stackoverflow.com/questions/10875130/…
    【解决方案2】:

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

    • FooImpl 声明为abstract

    • 实现bar方法

    因为“Java 接口不实现行为”。

    供您参考,请参阅this 页面。

    【讨论】:

    • 问题是如何实现bar
    猜你喜欢
    • 2012-06-08
    • 1970-01-01
    • 2013-06-09
    • 2018-09-24
    • 2021-10-28
    • 2015-08-25
    • 2011-02-19
    • 2020-03-10
    • 2012-04-11
    相关资源
    最近更新 更多