当前位置: 首页 > 知识库问答 >
问题:

AbstractMethodError使用Scala中的vararg参数重写Java方法时出错

纪翰
2023-03-14

我需要从使用vararg参数的Java接口重写Java方法:

public interface Function<T> {
    T apply(Object... var1);
}

当我尝试在Scala中实现该方法时,如下所示

class ScalaFunction extends Function[String] {

  override def apply(args: Object*): String = args.toList match {
    // impl
  }

}

我在运行时得到一个"java.lang.AbstractMEDError: null"错误。

这是我已经尝试过的:

>

  • 使用@varargs argsScala注释,它应该生成一个Java友好的委托方法=

    def apply(args:Array[Object]):Unit=apply(args:*)

    它实际上被成功调用了,但我不能使用字符串作为返回类型,因为编译器会生成一个

    错误:(13,7)双重定义:def应用(args: Array[Object]):第20行的字符串和重写def应用(args: AnyRef*):第13行的字符串在擦除后具有相同的类型:(args: Array[Object])字符串

    调用Java代码如下:

    Object[] args = //...
    Object returnValue = function.apply(args);
    

    有什么想法吗?

    有关示例,请参见以下要点:https://gist.github.com/mrueegg/f191e547bee6a24a6bcf

    谢谢,迈克尔

  • 共有1个答案

    常波鸿
    2023-03-14

    这个问题。我没有密切关注,但可能有人想添加信息。

     类似资料:
    • 问题内容: 我正在使用REPL用Scala数组调用Java vararg方法。 如果执行此操作,则会出现错误: 但是,如果我这样做,那就行得通: 我的问题是怎么办?Scala API在哪里定义? 问题答案: 添加告诉编译器将数组视为varargs。Scala与Java的工作原理相同。如果我有方法 我可以这样称呼它: 但是,如果我想向其传递实际的序列(与一样),我会这样做:

    • 考虑以下代码: 它打印Why?Scala变量不是数组吗? 笔记 我在堆栈溢出上发现了几个关于斯卡拉变量的问题,但所有这些问题都是关于调用Java varargs方法或将Scala列表转换为数组的。

    • 问题内容: 我有一个抽象类 Monitor.java ,它由类 EmailMonitor.java 子类 化 。 方法: 在 Monitor.java中 定义,并且必须在 EmailMonitor.java中 覆盖。 我目前在 EmailMonitor.java中 重写了如下方法: 但是,这会产生编译时错误: 是的子类,因此(至少在我看来)以这种方式覆盖它是很有意义的。看到编译器对我的逻辑不满意,

    • 我有这个Java接口 如何重写此方法?我试过:

    • 我无法编译一个需要从抽象类超类型重写方法的方法,该类超类型使用泛型作为其中一个参数。编译器抱怨扩展类的setRef()方法没有重写超类型中的方法。 父摘要类: 参考是: 而Interf是: 扩展子类(setRef()不编译): 我也尝试过使用通配符,但收到了相同的错误。使用通配符时,抽象类“setRef()是: 扩展类setRef()是: 甚至: 我能让它编译的唯一方法是,如果扩展类“setRef