我最近发布了一个关于 SO(如何使用双重调度来分析图形基元的交集?)的问题,其中一个答案(我已经接受)使用了泛型,包括<P>
和<R>
。它们不在 Oracle 文档Java 泛型列表中,但我已经看到它们在其他地方使用(例如,访问者模式中的泛型过度杀伤)——它们是否特定于访问者模式?为什么两者都super
使用extends
?
代码是:
public interface ShapeVisitor<P, R> {
R visitRect(Rect rect, P param);
R visitLine(Line line, P param);
R visitText(Text text, P param);
}
public interface Shape {
<P, R> R accept(P param, ShapeVisitor<? super P, ? extends R> visitor);
Shape intersectionWith(Shape shape);
}
public class Rect implements Shape {
public <P, R> R accept(P param, ShapeVisitor<? super P, ? extends R> visitor) {
return visitor.visitRect(this, param);
}
public Shape intersectionWith(Shape shape) {
return shape.accept(this, RectIntersection);
}
public static ShapeVisitor<Rect, Shape> RectIntersection = new ShapeVisitor<Rect, Shape>() {
public Shape visitRect(Rect otherShape, Rect thisShape) {
// TODO...
}
public Shape visitLine(Line otherShape, Rect thisShape) {
// TODO...
}
public Shape visitText(Text otherShape, Rect thisShape) {
// TODO...
}
};
}
我会很感激