类型参数名称P和R是什么意思,它们是如何使用的?

时间:2013-10-18 12:20:01

标签: java generics

我最近在SO(How do I use double dispatch to analyze intersection of graphic primitives?)上发布了一个问题,其中一个答案(我已接受)使用了包含<P><R>的泛型。它们不在Oracle文档Java generics list中,但我已经看到它们在其他地方使用过(例如Generics overkill in visitor pattern) - 它们是否特定于访问者模式?为什么使用superextends

代码是:

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...
        }
    };
}

我很感激

2 个答案:

答案 0 :(得分:2)

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

现在,在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));
}

因此,您只需指定此类对象所具有的关系类型。