- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我得到了一个通用接口(interface),其中一个方法接受通用类型的参数:
public interface ComponentRenderer<T extends GuiComponent> {
public void draw(T component);
}
此外,我还有一个抽象类,它使用有界通配符声明此接口(interface)类型的变量:
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”的参数,因此出于某种原因,它无法弄清楚参数应该是哪种类型。 ..
最佳答案
问题是 ? extends GuiComponent
表示“GuiComponent
的一个特定子类型,但未知是哪个”。
编译器不知道 this
是 ComponentRenderer
的正确 GuiComponent
子类型。渲染器可能只能与其他一些特定的子类一起工作。
您必须使用某种自类型模式以类型安全的方式执行此操作。这样您就可以将渲染器的类型变量与 GuiComponent
子类的类型“连接”起来。
例子:
class Gui {}
interface ComponentRenderer<T extends GuiComponent<T>> {
public void draw(T component);
}
// T is the self-type. Subclasses will set it to their own type. In this way this class
// can refer to the type of its subclasses.
abstract class GuiComponent<T extends GuiComponent<T>> extends Gui {
private ComponentRenderer<T> componentRenderer;
public void draw() {
this.componentRenderer.draw(thisSub());
}
public void setComponentRenderer(ComponentRenderer<T> r) {}
// This method is needed for the superclass to be able to use 'this'
// with a subclass type. Sub-classes must override it to return 'this'
public abstract T thisSub();
//and a setter and getter for the ComponentRenderer
}
// Here the self-type parameter is set
class GuiButton extends GuiComponent<GuiButton> {
public GuiButton(/* ... */) {
//...
this.setComponentRenderer(new FlatButtonRenderer());
}
class FlatButtonRenderer implements ComponentRenderer<GuiButton> {
@Override
public void draw(final GuiButton component) {
//...
}
}
@Override
public GuiButton thisSub() {
return this;
}
}
这最初(我认为)称为 curiously recurring template pattern . This answer更多解释。
关于java - 调用通用接口(interface)方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37681306/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!