我有一个类ShapeDescriber
看起来像这样:
public class ShapeDescriber<T extends Shape> {
public void describe(T shape) {
System.out.println("Its color is " + shape.getColor());
}
}
我使用
T
以便子类可以执行以下操作:public class CircleDescriber<T extends Circle> extends ShapeDescriber<T> {
public void describe(T circle) {
super.describe(circle);
System.out.println("Its radius is " + circle.getRadius());
}
}
最终,我希望此
Describer
类型层次结构与模型的类型层次结构匹配。我遇到的问题是,在
CircleDescriber
内部,我无法将Circle
传递给我的describe()
方法!当我尝试这个:public class CircleDescriber ... {
...
public void printATest() {
Circle c = new Circle(Colors.GREEN, 10);
this.describe(c);
}
}
我的
describe()
调用出现编译错误,原因是:The method describe(T) in the type CircleDescriber<T> is not applicable for the arguments (Circle)
等待。什么?我感觉这个类知道
T
的每个实例都是Circle
的子类,不是吗?编辑:为了方便复制,我在这里创建了要点:https://gist.github.com/craigotis/135f88b1ce8beca07400
请注意,以上要点将无法编译。
最佳答案
我认为这应该按原样工作,但要取决于您如何实例化CircleDescriber
。这应该工作:
new CircleDescriber<Circle>().describe(circle);
无法编译的原因是,您在
CircleDescriber
内部具有test方法,并调用了this
。由于编译器不知道this
的通用参数,因此无法确定是否将Circle
传递给它(如果this
引用参数化为CircleDescriber
子类的Circle
会怎样? >?)在测试方法中用this
更改new CircleDescriber<Circle>()
,然后编译。但是,在这里您看到实际上是在类名和通用参数中指定两次描述
Circle
。至少在Circle
是层次结构中的叶节点时,这不是必需的。相反,请执行以下操作:(保持
ShapeDescriber
原样)public class CircleDescriber extends ShapeDescriber<Circle> {
@Override
public void describe(Circle circle) {
super.describe(circle);
System.out.println("Its radius is " + circle.getRadius());
}
}