日期:2014-05-20  浏览次数:20623 次

关于泛型不明白的地方
Java code

abstract class A<T>{
    public T obj;
    
    public A(T obj){
        this.obj = obj;
    }
    
    protected abstract T getObj();
    
    protected abstract void setObj(T obj);
}

class B extends A{
    
    public B(ArrayList<String> list){
        super(list);
    }

    @Override
    protected ArrayList<String> getObj() {
        return null;
    }

    @Override
    protected void setObj(ArrayList<String> obj) {
    }
}



上面的getObj()返回值类型可以为ArrayList<String> 这是协变返回类型,没问题。
但setObj(ArrayList<String> obj) 就不行了,无法重写父类的setObj(T obj)。
还有如果我在子类中访问父类的obj变量,是Object类型,并不是子类中构造参数的类型。
我知道直接访问变量不是个好习惯,可是泛型在这里的作用还有么,和直接用Object做为类型没有任何差别啊。

------解决方案--------------------
abstract class A<T>{
public T obj;

public A(T obj){
this.obj = obj;
}

protected abstract T getObj();

protected abstract void setObj(T obj);
}

class B extends A<ArrayList<String>{

public B(ArrayList<String> list){
super(list);
}

@Override
protected ArrayList<String> getObj() {
return null;
}

@Override
protected void setObj(ArrayList<String> obj) {
}
}