在java中重写可变参数

Nic*_*s K 0 java overriding variadic-functions

我试图回答另一个问题,这导致我问自己的问题。我做了一些研究,但找不到有关上述主题的任何信息。

我有一个抽象类Character,它有 1 个带有 varargs 参数的抽象方法,如下定义

public abstract class Character {
   public abstract void doSomething(int... values);
}
Run Code Online (Sandbox Code Playgroud)

我的印象是任何扩展此类的类都可以使用任意数量的参数覆盖此方法。

// 1st example
public class Player extends Character { 
   @Override
   public void doSomething(int x, int y) { // Two params - do something }
}

// 2nd example 
public class NPC extends Character {
   @Override
   public void doSomething() { // No params - do something }
}
Run Code Online (Sandbox Code Playgroud)

但上面的两个例子都导致了编译时错误。我想知道我在这里错过了什么?上述场景有可能吗?

任何帮助表示赞赏。

das*_*ght 5

Java 中的变量参数函数是一个纯粹的编译器技巧:当你声明这样的方法时

public abstract void doSomething(int... values);
Run Code Online (Sandbox Code Playgroud)

编译器创建一个这样的方法

public abstract void doSomething(int[] values);
Run Code Online (Sandbox Code Playgroud)

并为自己做一个“心里笔记”,以便您可以doSomething根据需要使用任意数量的整数参数进行调用。当您进行调用时,编译器会将您列出的参数包装到一个数组中,并将该数组传递给doSomething.

至于用采用固定数量参数的实现来重写此类方法的能力,这是不可能的:如果 Java 允许(它不允许),程序员将能够创建违反抽象接口的类层次结构他们扩展的类。在第一种情况下,Player将无法处理此调用:

Character player = new Player(); // Allowed
player.doSomething(1, 2, 3, 4, 5); // What happens to 3, 4, and 5?
player.doSomething(1); // What value do we pass for y?
Run Code Online (Sandbox Code Playgroud)

NPC也会有同样的问题。

您可以使用采用数组的方法覆盖变量参数方法:

@Override
void doSomething(int[] values) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

演示。