2016-09-14 14 views
1

GenericsJavaについて学習し始めています。いくつかのチュートリアルを読んでいますが、私はちょっと混乱していて、一般的な方法が宣言されているかどうかはわかりません。Java汎用メソッド宣言の基礎

ジェネリック型を使用する場合、メソッドを定義する正しい順序は何ですか?私はこのサンプルを見つけました。アングルブラケットを使用する必要があります。

public class Box<A> { 

    private A a; 
    ... 

    public void setA(A a) { 
     this.a = a; 
    } 

    public <A> List<A> transform(List<A> in) { 
     return null; 
    } 

    public static <A> A getFirstElement(List<A> list) { 
     return null; 
    } 

    public A getA() { 
     return a; 
    } 

答えて

3

問題は、あなたのコードが同じ文字Aを使用していることですが、それは別の場所でいくつかの異なる「意味」があります:あなたはここで言っているので、必要な

public class Box<T> { 

括弧を:

:ボックスTのは括弧なしで行く

用途T.と呼ばれるジェネリック型を、使用しています10

private T a; public void setA(T a) { 

しかし、

public <T2> List<T2> transform(List<T2> in) { 

型パラメータを導入しています。私はそれが明確ではない T.と同じアイデアはスコープは、T2のだけその1つの方法transformであるということです、それはであることを確認するためにT2それを命名しました。他の方法はT2について知らない!

同上
public static <A> A getFirstElement(List<A> list) { 

- あなたのコメントをここに「T3」になります;-)

EDIT:あなたは静的方法は単純で、クラス全体の型Tを使用することはできませんありえない!その理由はhereを参照してください!

2番

EDIT:ジェネリックは、あなたが(それが異なるクラスを取り扱うことができるよう)ジェネリックでコードを記述することができます。コンパイル時にコンパイル時にという安全性が与えられます。例:人々がジェネリックを持っていた前に、彼らは唯一のあちこちオブジェクトに対処することができ

Box<String> stringBox = new Box<>(); 
Box<Integer> integerBox = new Box<>(); 
integerBox.add("string"); // gives a COMPILER error! 

。手動鋳造。

+0

さて、私はそれを少しベットしていると思いますr。しかし、どのようにBoxクラスのTを返すために静的メソッドを調整する必要がありますか? – Eve

+0

あなたのコメントに答えるために私の答えが更新されました。 – GhostCat

+0

ありがとう、あなたのほとんどの種類:) 最後の質問は、ジェネリック型で宣言されたクラスを持つメリットは何ですか? public class Box(){ プライベートTt; パブリックボックス(T t){ this.t = t; } – Eve

0

タイプを返す必要がある要件がある場合は、そのときのメソッドパラメータに依存します。例のようにメソッドのシグネチャの前にアングルブラケットを書くことができます。オブジェクト

1

あなたの例の複数種類のために使用する必要が同じクラスまたはユーティリティは、2つの異なる概念を示しており、機能のため:ジェネリッククラスジェネリックメソッド

このタイプの導入ジェネリッククラスありますパラメータ<A>

public class Box<A> { 

} 

これらは彼ら自身型パラメータ<A>導入汎用メソッドですが:

public <A> List<A> transform(List<A> in) { 
    return null; 
} 

public static <A> A getFirstElement(List<A> list) { 
    return null; 
} 

特定の名前のフィールドとパラメータを持つメソッドを持つクラスとそれを比較しますその名前の:

public class Box { 
    private String name; 

    publix Box(String name) { 
    } 
} 
関連する問題