我有一个抽象类,它有另一个内部抽象类,如下所示:
public abstract class TemplateFace {
public abstract Layout generateFace();
public abstract class PopulateGridHandler implements ClickHandler {
@Override
public abstract void onClick(ClickEvent event);
}
}
我还有另一个类,它扩展了 TemplateFace 类,如下所示:
public class AdminFace extends TemplateFace {
private ListGrid adminListGrid;
public Layout generateFace() {
adminListGrid = GridBuilder.buildFullGrid(this);
}
public class PopulateGridHandler implements ClickHandler {
@Override
public void onClick(ClickEvent event) {
// some implementations...
}
}
}
最后,我试图在另一个类中使用AdminFace类的内部PopulateGridHandler类(扩展抽象类的类),如下所示:
public class GridBuilder {
// Here i get the argument as abstract class
public static ListGrid buildFullGrid(TemplateFace templateFace)
{
ToolStripButton addRowButton = new ToolStripButton();
addRowButton.setPrompt("Add new record");
// I get the error here saying: Cannot instantiate the type
// TemplateFace.PopulateGridHandler
addRowButton.addClickHandler( templateFace.new PopulateGridHandler() );
}
}
ALL IN ALL ,我只是想利用一个抽象类,其中包含另一个抽象类。但是java编译器认为我试图实例化一个抽象类。我该如何解决这个问题?
感谢您的帮助,推荐,评论......
答案 0 :(得分:3)
Java编译器只知道参数templateFace
的声明类型 - 在本例中为TemplateFace
。所以表达式
templateFace.new PopulateGridHandler()
确实意味着:实例化 abstract 类PopulateGridHandler
(不允许)。
实际上,您似乎试图在子类中覆盖内部抽象类定义。那不行。只能覆盖方法。这也是要走的路:
public abstract class TemplateFace {
public abstract Layout generateFace();
public abstract PopulateGridHandler createPopulateGridHandler();
protected abstract class PopulateGridHandler implements ClickHandler{
@Override
public abstract void onClick(ClickEvent event);
}
}
然后将您的子类声明如下:
public class AdminFace extends TemplateFace{
private ListGrid adminListGrid;
public Layout generateFace() {
adminListGrid = GridBuilder.buildFullGrid(this);
}
public PopulateGridHandler createPopulateGridHandler() {
return new MyPopulateGridHandler();
}
private class MyPopulateGridHandler extends PopulateGridHandler {
@Override
public void onClick(ClickEvent event) { // some implementations ... }
}
}
然后只需使用方法createPopulateGridHandler
来创建这样的类:
public static ListGrid buildFullGrid(TemplateFace templateFace) {
ToolStripButton addRowButton = new ToolStripButton();
addRowButton.setPrompt("Add new record");
addRowButton.addClickHandler(templateFace.createPopulateGridHandler());
}