class A123 {
public void foo(String str) {
System.out.println("1");
}
}
class B123 extends A123 {
public <T> void foo(T item) {
System.out.println("2");
}
}
我认为,当运行以下内容时:
public class Test123 {
public static void main(String[] args){
B123 b = new B123();
b.foo("test");
}
}
我认为通过向www.example.com发送一个字符串b.foo,编译器将“String”类型放在T中,然后它将被重写,b.foo(“test”)将打印2,但实际上它打印“1”。为什么?
更重要的是:如果我有相反的-
class A123 {
public <T>void foo(T item) {
System.out.println("1");
}
}
class B123 extends A123 {
public void foo(String str) {
System.out.println("2");
}
}
我跑:
public class Test123 {
public static void main(String[] args){
A123 b = new B123();
b.foo("test");
}
}
(我有一个指向B的A123指针),所以B123中的foo不会覆盖A中的foo,并且打印“1”。
1条答案
按热度按时间uelo1irk1#
编译器选择匹配的 * 最具体的 * 方法签名。
在这里,
String
是尽可能具体的。当然比T
更具体,T
可以匹配任何东西。