我有一些代码如下:
public class java_generic {
public static void main(String[] args) {
T t = new X();
t.<Object>m(new Object());
t.<String>m(new String());
}
static class T {
<E> void m (E e){
System.out.println("here is T");
}
}
static class X extends T {
void m (String o){
System.out.println("here is X");
}
}
}
根据我的理解,在类型擦除之后,
T
类将变为: static class T {
void m (Object e){
System.out.println("here is T");
}
}
并且m重载。
由于具有
m(Object)
和m(String)
,我希望结果是here is T
here is X
但是,结果是
here is T
here is T
我不知道为什么结果会是这样。
最佳答案
您几乎回答了自己的问题。您只需要完全了解后果即可。对所有进行擦除,您将得到以下信息:public class java_generic {
public static void main(String[] args) {
T t = new X();
t.m(new Object());
t.m(new String());
}
static class T {
void m (Object e){
System.out.println("here is T");
}
}
static class X extends T {
void m (String o){
System.out.println("here is X");
}
}
}
希望这很明显,X.m
不会覆盖T.m
,因此通过T
引用进行的调用永远不会调用X.m
。
关于java - Java泛型-擦除概念,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34162305/