gpt4 book ai didi

java - 如果重写方法没有,为什么重写方法不能指定类型参数?

转载 作者:行者123 更新时间:2023-11-29 04:34:39 24 4
gpt4 key购买 nike

以下代码无法编译,但是,如果我将 f(object) 更改为 f(String) 或 f(Integer),它会编译。我已经阅读了有关该主题的其他帖子,但我仍然不明白,为什么编译器不知道使用哪种方法(如果是新实例 A a = new B();)

public class SampleTester { 
public static class A {
public void f(int x) { System.out.print("1"); }
public void f(Object x) { System.out.print("2"); }
}
public static class B extends A {
public <T> void f(T x) { System.out.print("3"); } //compiler error
}
public static void main(String[] args) {
A a = new A();
B b= new B();
a.f(3);
a.f("foo");
b.f(3);
b.f("foo");
}
}

如果我将 T x 更改为 Object t 它仍然无法编译,那有什么区别呢?此外,为什么它不直接覆盖 A 中的函数? (两者在类型删除后具有相同的签名

最佳答案

类(class)B延伸A因此继承了 A 中存在的所有方法.这意味着 B将有 3 种方法:

public void f(int x)
public void f(Object x)
public <T> void f(T x)

问题是 f(T x)将在编译期间进行类型删除,并且 T将替换为 Object ,因此导致重复方法,因为您已经有一个采用 Object 的方法争论。

要解决此问题,请删除采用 Object 的方法参数或为 T 提供上限. (例如 T extends Number,以便在类型删除期间将 T 替换为 Number)


要解决您的评论(我现在已将其添加到您的问题中):

public <T> void f(Object x)不编译,因为它不是 public void f(Object x) 的有效覆盖来自 A .

方法public <T> void f(Object x)属于子类,可以使用 superlcass 引用作为 a.<Integer>f(null); 调用或 a.<String>f(null); .由于覆盖方法在运行时解析但是泛型在编译时本身会经历类型删除,编译器无法知道是否替换 TIntegerString在编译时。

反转这些方法仍然是合法的,这样你就有了方法 public <T> void f(Object x)A和方法public void f(Object x)B因为编译器拥有所有必要的信息来决定什么 <T>应替换为。

关于java - 如果重写方法没有,为什么重写方法不能指定类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42188752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com