2013-05-20 17 views
5

Javaの汎用メソッドを理解しようとしています。私は、私が代わりにAREA2(またはその逆)のAREA1を実装する/使うべき理由を理解/見ることができません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(); 
    } 

} 

:次のコードを考えます。何か不足していますか?両方のメソッドが同じことをしないのですか?

それはarea1メソッドを作成するための正当な理由がないのJava

+1

この場合ジェネリックスを使用することは意味がありません。それが意味をなさないケースは、どのような種類のものを保存しなければならないかわからないときです**。 –

+1

この場合、@ LukasKnuthは、エリアの一般的なバージョンを作成する必要はないと言いました。しかし、現在のOracleのドキュメントには、ジェネリックスの素晴らしい例が示されています。ワイルドカードのジェネリックの例は、混乱を明確にするのにも役立ちます。http://docs.oracle.com/javase/tutorial/extra/generics/methods.html –

+0

私はC++のおおまかなものとしてジェネリックを検討していましたテンプレート。あなたがここで指摘した重要なことは、他の回答から欠けていることです(そして、おそらく私が見逃しているのは、あなたが「**保存するタイプ」を知らないときに使用されるというコンセプトです」 私はその答えを探していました:-) – Xaq

答えて

4

におけるジェネリック医薬品について少し混乱私を残しています。 area2の方法が好ましい。ジェネリックスは、特定の未知のタイプとの関係がある場合に使用されます。ここでは、パラメータshapeに特化したものは何もありません。インターフェイスShapeは既にareaメソッドを使用できるため、Shapeの特定の実装がshapeとして渡されるかどうかは関係ありません。したがってジェネリックはここでは必要ありません。 Tタイプのパラメータは、任意の戻り値で使用されていないので、あなたの例では

public long area2(Shape shape) 
13

使用することは、違いはありません。あなたがmovedShape1()を使用して明らかな利点を見ることができます。ここ

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

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

しかし、あなたは以下のメソッドを持っていた想像してみてください。型の安全性を失うことなく、戻り値のより具体的な型を取得します。

+0

それはまだ同じではありませんか?私は余分な型の安全性を見ていない、彼らは両方の形状を返す彼らはないのですか? – Xaq

+2

@Xaq: 'Circle implements Shape'クラスの場合、' Circle'パラメータで 'movedShape1()'を呼び出すと 'Shape'ではなく' Circle'が返されます。同じ 'Circle'パラメータで' movedShape2() 'を呼び出すと、' Shape'が生成されます。 – Keppil

+0

@Xaq、Keppilはそうです。そのようなメソッドを呼び出すと非常に便利です。 – dantuch

0

私はこの場合 - シェイプは(抽象)クラスではなくインターフェイスであるため、実装する必要があります(思考のgnerics形式で拡張) - 私は彼らが同じようにexacltyを行い、ジェネリックが追加されていると思います実際に何が起こっているかだけをシャドウイング

関連する問題