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}}。这似乎打败了仿制药的目的......
帮助?
答案 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
(并且记得编程到接口),则不需要构造函数,并且因为它受到保护,所以子类可以直接访问它。