我最近在SO(How do I use double dispatch to analyze intersection of graphic primitives?)上发布了一个问题,其中一个答案(我已接受)使用了包含<P>
和<R>
的泛型。它们不在Oracle文档Java generics list中,但我已经看到它们在其他地方使用过(例如Generics overkill in visitor pattern) - 它们是否特定于访问者模式?为什么使用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...
}
};
}
我很感激
答案 0 :(得分:2)
名称P
和R
只是标识符。根据它们的使用方式来判断,我认为它们分别代表“参数”和“返回值”。
现在,在Shape.accept
方法中,参数可以变为反变量,这就是为什么您看到super
P
和返回值共变体的原因,那就是你在extends
看到R
的原因。
答案 1 :(得分:0)
创建课程时:
public class MyComparable<R>{
public boolean compare(R r1, R r2){
// Implementation
}
}
您只是表明您需要使用同一类的两个对象。
初始化您将使用的课程
List<String> strings = fillStrings();
int i = 1;
while(i < strings.size()){
boolean comparePreviousWithThis = new MyComparable<String>().compare(strings.get(i-1),strings.get(i));
}
因此,您只需指定此类对象所具有的关系类型。