java在泛型类重写中为什么有些类返回空值?请执行以下代码
通用覆盖程序: 类代码:包含genric super和泛型子类,它们将show()作为被重写的ans,试图根据被重写的方法将执行的条件来确定
class GA<T>{
private T type;
public GA(){
}
public GA(T type) {
this.type = type;
}
public <T> void show(){
System.out.println("GA:"+this.type);
}
}
class GB<T> extends GA<T>{
private T type;
public GB(T type) {
this.type = type;
}
public <T> void show(T type){
System.out.println("GB:"+type);
}
}
public class VarArg {
public static <T> void show(T... a) {
System.out.println("Element Length:" + a.length);
for (T aa : a) {
System.out.println("Element:" + aa);
}
}
public static void main(String[] args) {
show(5, 5, 5, 5);
show(5.2, 5.1, 5.5);
GA[] arrayStr = {new GA<String>("Str"),new GB<Integer>(10),new GA<Double>(5.5)};
for(GA ga: arrayStr ){
ga.show();
}
GA<String> str = new GB<String>("H");
str.show();
}
}
结果包含GA:null。我不明白它为什么会来
结果:
Element Length:4
Element:5
Element:5
Element:5
Element:5
Element Length:3
Element:5.2
Element:5.1
Element:5.5
GA:Str
GA:null
GA:5.5
GA:null
# 1 楼答案
类
GB
中的private T type;
实际上是一个与GA
中的type
不同的字段,因为不可能重写或重新声明子类中超类的字段。现在,在GB
的构造函数中,由于没有显式的super(...)
,因此隐式地调用了超类的默认构造函数,这使得GA.this.type
位于null
此外,类
GB
中的show
方法不会被重写,因为它与GA
中的参数列表不同。更重要的是,它永远不会被呼叫到任何地方