2

我最近发布了一个关于 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...
        }
    };
}

我会很感激

4

2 回答 2

3

名称PR只是标识符。从它们的使用方式来看,我认为它们分别表示“参数”和“返回值”。

现在,在该Shape.accept方法中,参数可以是逆变的,这就是为什么你看到superwithP和一个返回值协变,这就是你看到extendswith的原因R

于 2013-10-18T12:23:48.033 回答
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));
}

所以你只是指定这个类的对象将具有的关系类型。

于 2013-10-18T12:25:00.890 回答