我有一些代码如下:
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
我想知道为什么结果会如此。
答案 0 :(得分:7)
你几乎回答了自己的问题。你只需要完全遵循后果。为你的代码所有擦除你得到的:
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
。
答案 1 :(得分:2)
由于 T 是 X 的超类,而 X 的实例被分配给超类对象 t ,您无法真正访问子类 X 方法。因此两者
t.<Object>m(new Object());
t.<String>m(new String());
调用超类泛型方法。
现在检查一下 -
public class java_generic {
public static void main(String[] args) {
X x = new X();
x.<Object>m(new Object());
x.<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");
}
}
}