【问题标题】:overridding string with var-args用 var-args 覆盖字符串
【发布时间】:2019-08-22 07:47:56
【问题描述】:

通常 Var arg 方法用相同的方法 var arg 方法覆盖,但在我的代码中,普通方法用 var args 覆盖。

但一般而言,Var args 方法只能覆盖或被其他 var args 方法覆盖,这与 Test.go(String[])A.go(String...) 不同。

但我得到了输出 T。

class A{
    public void go(String...s){
            System.out.println("A");
    }
}

class Test extends A {

    public void go(String[] a){
        System.out.println("T");
    }

    public static void main(String[] args){
        A a = new Test();

        a.go("dd");
    }
}

输出:T

【问题讨论】:

    标签: java oop methods overriding variadic-functions


    【解决方案1】:

    String[]String... 在某些情况下是等价的,所以go(String... s) 可以被go(String[] s) 覆盖。是java中表示数组的方式之一。

    【讨论】:

    • “等效”几乎。您可以使用显式数组调用可变参数方法,但不能反过来。
    • 这适用于 1.8 版本,同样适用于 1.7 或 1.6
    【解决方案2】:

    Varargs 只是对相同类型数组的语法糖化,它向编译器指示从此时开始的一系列以逗号分隔的参数应该被视为一个数组。从签名的角度来看,String[]String... 是相同的。例如,您可以根据需要将 main 方法定义为 public static void main(String... args)

    【讨论】:

    • 这适用于 1.8 版本,同样适用于 1.7 或 1.6
    【解决方案3】:

    这两个声明是等效的,因为 Java 编译器将 varargs 扩展为指定类型的数组。 所以你已经有效地覆盖了go 方法。

    看看https://www.journaldev.com/1257/java-varargs#how-java-varargs-work

    【讨论】:

      猜你喜欢
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多