【发布时间】:2016-06-07 13:49:36
【问题描述】:
我得到了一个泛型接口,其中一个方法接受泛型类型的参数:
public interface ComponentRenderer<T extends GuiComponent> {
public void draw(T component);
}
此外,我有一个抽象类,它使用有界通配符声明此接口类型的变量:
public abstract class GuiComponent extends Gui {
private ComponentRenderer<? extends GuiComponent> componentRenderer;
public void draw() {
this.componentRenderer.draw(this);
}
//and a setter and getter for the ComponentRenderer
}
还有一个子类,它为 componentRenderer 设置了一个实现:
public class GuiButton extends GuiComponent {
public GuiButton(/* ... */) {
//...
this.setComponentRenderer(new FlatButtonRenderer());
}
FlatButtonRenderer 的实现方式为:
public class FlatButtonRenderer implements ComponentRenderer<GuiButton> {
@Override
public void draw(final GuiButton component) {
//...
}
}
我看不到哪里出错了,但是 GuiComponent 中的调用 componentRenderer.draw(this) 无法正常工作,出现以下错误:
据我了解,它告诉我,我不能使用 GuiComponent,因为它不是从 GuiComponent 派生的,这没有任何意义。我也试过? super GuiComponent,会接受draw()的调用,但是不接受FlatButtonRenderer的实现
我不明白这个语法错误,有没有人知道,我需要如何更改代码?
编辑: 当我在调用 draw() 时使用 IDE 的代码完成时,它告诉我,draw 接受一个“null”类型的参数,所以由于某种原因,它无法弄清楚参数应该是哪种类型。 ..
【问题讨论】:
-
与您的问题无关:您为什么要尝试将绘图拉入不同的对象?一个 GuiComponent 的目的不就是要在屏幕上绘制吗?
-
因为我希望 Gui Button 包含按钮逻辑,这总是相同的,但我希望按钮可以有不同的布局和样式。所以可以切换渲染器,我得到了一个布局不同的工作按钮。
-
很公平。我不知道您的用例的详细信息,但从我所见,定义样式或子类化使组件更易于使用。