11
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(Say, Tool<Thing>) 时选择什么,我总是得到一个AbstractThing而不是Thing. 这似乎违背了泛型的目的......

帮助?

4

3 回答 3

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

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

于 2009-09-13T15:03:25.003 回答
3

不应该 Tool<AT extends...> extends AbstractTool<AT>吗?

于 2009-09-13T15:03:56.277 回答
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如果您在声明时初始化(哦,记住对接口进行编程),则不需要构造函数,并且因为它受到保护,子类可以直接访问它。

于 2009-09-13T17:34:13.603 回答