2

私は最近、SO(グラフィックプリミティブの交差を分析するためにダブルディスパッチを使用するにはどうすればよいですか?)に関する質問を投稿しました. それらは Oracle ドキュメントのJava ジェネリック リストにはありませんが、他の場所で使用されているのを見てきました (例:ビジター パターンでのジェネリックのやり過ぎ) - それらはビジター パターンに固有のものですか? そして、なぜ と の両方が使用されるのですか?<P><R>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...
        }
    };
}

そして私は感謝します

4

2 に答える 2

3

名前PRは単なる識別子です。使い方から判断すると、それぞれ「パラメータ」と「戻り値」を意味していると思います。

メソッドではShape.accept、パラメーターを反変にすることがsuperできPます。extendsR

于 2013-10-18T12:23:48.033 に答える
0

クラスを作成する場合:

public class MyComparable<R>{

    public boolean compare(R r1, R r2){
        // Implementation
    }
}

同じクラスの 2 つのオブジェクトを使用する必要があることを示しているだけです。

使用するクラスを初期化する

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 に答える