5

Java のジェネリック メソッドを理解しようとしています。次のコードがあるとします。

public class GenericTest {

    interface Shape {
        public long area();
    }

    public static class Triangle implements Shape
    {
        private long base, height;
        public long area() { return (base * height) / 2; }
    }

    public static  class Rectangle implements Shape
    {
        private long width, height;
        public long area() { return width * height; }
    }

    public <T extends Shape> long area1(T shape)
    {
        return shape.area();
    }

    public long area2(Shape shape)
    {
        return shape.area();
    }

}

なぜarea2の代わりにarea1を使用/実装する必要があるのか​​ わかりません/理解できません(またはその逆)。何か不足していますか?どちらの方法も同じことをしませんか?

Javaのジェネリックに関して少し混乱しました

4

3 に答える 3

13

あなたの例では、T型パラメーターは戻り値で使用されていないため、違いはありません。

ただし、次の方法があるとします。

public <T extends Shape> T movedShape1(T shape) {
    return shape.move();
}

public Shape movedShape2(Shape shape) {
    return shape.move();
}

ここでは、 を使用する明確な利点を確認できますmovedShape1()。型の安全性を失うことなく、戻り値のより具体的な型を取得します。

于 2013-05-20T19:09:34.157 に答える
4

area1メソッドを作成する正当な理由はありません。area2方法が好ましい。ジェネリックは、特定の未知の型との関係がある場合に使用されます。ここでは、パラメーターについて具体的なことは何もありませんshape。インターフェイスShapeはすでにメソッドを使用できるようにしているため、どの特定の実装がとして渡されるareaかは気にしません。したがって、ここではジェネリックは必要ありません。Shapeshape

使用する

public long area2(Shape shape)
于 2013-05-20T19:08:35.443 に答える
0

私はこの場合-形状は(抽象)クラスではなくインターフェイスであるため、実装する必要があります(一般的な考え方で拡張されています)-それらはまったく同じであり、ジェネリックを追加すると、実際に何が隠されているだけです進行中

于 2013-05-20T19:09:53.183 に答える