扩展通用抽象类&正确使用超级

时间:2009-09-13 14:57:59

标签: java generics super

public abstract class AbstractTool<AT extends AbstractThing> {
    protected ArrayList<AT> ledger;
    public AbstractTool() {
        ledger = new ArrayList<AT>();
    }

    public AT getToolAt(int i) {
        return ledger.get(i);
    }

    // More code Which operates on Ledger ...

}

public class Tool<AT extends AbstractThing> extends AbstractTool {
    public Tool() {
        super();
    }
}

如何正确调用super将AT Tool的泛型传递给AbstractTool构造函数?

在我宣布AT(说,Tool)时,无论我选择Tool<Thing>是什么,我总是会回来AbstractThing而不是{{} 1}}。这似乎打败了仿制药的目的......

帮助?

3 个答案:

答案 0 :(得分:19)

public class Tool<AT extends AbstractThing> extends AbstractTool<AT> {

换句话说,如果您使用泛型扩展或实现某些内容,请记住为它们定义泛型参数。

答案 1 :(得分:3)

不应该是 Tool<AT extends...> extends AbstractTool<AT>

答案 2 :(得分:0)

我认为你可能想要的是:

   public abstract class AbstractTool<AT extends AbstractThing> {
        protected List<AT> ledger = new ArrayList<AT>();

        public AT getToolAt(int i) {
            return ledger.get(i);
        }

        // More code Which operates on Ledger ...

    }

    public class Tool extends AbstractTool<Thing> {
        // Tool stuff ...
    }

由于Tool是一个具体类,因此不需要对其进行参数化。如果在声明时初始化List(并且记得编程到接口),则不需要构造函数,并且因为它受到保护,所以子类可以直接访问它。