2012-10-17 7 views
25

私は、以下に示すような方法で見てきました:それは何をするん<Tは何を意味するのですか?

protected <T extends ABC> T save(T Acd, boolean en) { 

を? Javaで呼び出されるこれらのタイプの宣言は何ですか?

+4

いくつかのチュートリアルを参照してください。 - http://docs.oracle.com/javase/tutorial/extra/generics/index.html –

+5

構造がどのように呼び出されているのか尋ねるのは悪いことではありません。+1 –

答えて

27

それは一般的な方法と呼ばれています。この全体のコンセプトは、Javaでは「ジェネリックス」と呼ばれています。その宣言は、TがABCのサブクラスである任意の型であることを意味します。

+1

アルファベットを使用できますか?またはそれがジェネリックメソッドであることを言い表す唯一の宣言型はTですか? –

+3

任意の文字を使用できます。 Tは「Type」の略語です。マップ構造では、 "Key"と "Value"タイプを意味するが使用されます。だからあなたは自由に手紙を選ぶことができます。しかし、私は理に適ったものを選ぶことをお勧めします。また、私は確信していませんが、それは文字に制限されていない可能性があります、あなたは単語を選択することがあります。また、ワイルドカードの種類があります。 – basar

+3

汎用タイプの引数には任意の有効な識別子を使用できますが、大文字である必要があります。この回答を参照してください:http://stackoverflow.com/questions/2900881/generic-type-parameter-naming-convention-for-java-with-multiple-chars 'List 'のようなものを読むと、 'Blah'がクラスか型パラメータかどうかを知ることができないので、単語を使うのは悪い考えです。 –

3

ABCオブジェクトまたはABCの子を送信する必要があります。他のクラスは許可されません。また、Acd変数はABCクラスのメソッドを使用することができます。このメソッドは、そのクラスに表示されるsaveメソッドです。

これは、Tクラスがインターフェイスを拡張する場合に便利です。たとえば、あなたがそうでない場合、配列は許可されません、オブジェクト配列をソートすると、このクラス TNE Comparableインタフェースを実装する必要があります処理するクラスを作成している:

class Class1 implements Comparable<Class1> { 
    //attributes, getters and setters... 
    int x; 

    //implementing the interface... 
    public int compareTo(Class1 c1) { 
     //nice implementation of compareTo 
     return (this.x > c1.x)? 1 : (this.x < c1.x) ? 0 : -1; 
    } 
} 

class Class2 { 
    int x; 
} 

public class Sorter<T extends Comparable<T>> { 

    public static void insertionSort(T[] array) { 
     //good implementation of insertion sort goes here... 
     //just to prove that you can use the methods of the Comparable interface... 
     array[0].compareTo(array[1]); 
    } 

    public static void main(String[] args) { 
     Class1[] arrC1 = new Class1[5]; 
     Class2[] arrC2 = new Class2[5]; 
     //fill the arrays... 
     insertionSort(arrC1); //good! 
     insertionSort(arrC2); //compiler error! 
    } 
} 
3

これは、パラメータTおよびTは、ABCクラスによって上部境界されなければならないboolean型をexceptsでsave methodです。 ABCクラスまたは任意のサブクラスが受け入れられます。

+1

あなたが 'expects'を意味すると思う – killjoy

+0

これは最も簡潔な答えですが、それをさらに完了するために、saveメソッドはType Tも返します。そのため、メソッド名の前にTがあるのです。かなり明白ですが、一見してではなく、最初のいくつかの答えを読んだ後ではありません。メソッド宣言のように見えて、Tsでいくつかのエイリアンコードが発生しました。 – killjoy

+0

「ABC」クラスも機能します。それが私が探していたものです。ありがとう – Dish

11

有界型パラメータ:

あなたは型パラメータに渡すことが許可されているタイプの種類を制限したいと思うときがあるかもしれません。たとえば、数値で動作するメソッドは、Numberまたはそのサブクラスのインスタンスを受け入れるだけの場合があります。これは、有界型パラメータのためのものです。

境界型パラメータを宣言するには、型パラメータの名前を指定し、続いてextendsキーワードを指定し、その後にその上限を指定します。 例:

次の例では、extendsが(クラスのように)または「実装する」(インタフェースのように)一般的な意味でどのように使用されるかを示します。この例は、3つのComparableオブジェクトのうち最大のものを返す汎用メソッドです。

public class MaximumTest 
{ 
    // determines the largest of three Comparable objects 
    public static <T extends Comparable<T>> T maximum(T x, T y, T z) 
    {      
     T max = x; // assume x is initially the largest  
     if (y.compareTo(max) > 0){ 
     max = y; // y is the largest so far 
     } 
     if (z.compareTo(max) > 0){ 
     max = z; // z is the largest now     
     } 
     return max; // returns the largest object 
    } 
    public static void main(String args[]) 
    { 
     System.out.printf("Max of %d, %d and %d is %d\n\n", 
        3, 4, 5, maximum(3, 4, 5)); 

     System.out.printf("Maxm of %.1f,%.1f and %.1f is %.1f\n\n", 
        6.6, 8.8, 7.7, maximum(6.6, 8.8, 7.7)); 

     System.out.printf("Max of %s, %s and %s is %s\n","pear", 
     "apple", "orange", maximum("pear", "apple", "orange")); 
    } 
} 
3

これはJavaのジェネリックスと呼ばれます。

公式の説明:簡単に言えば、ジェネリックスは、クラス、インターフェース、メソッドを定義するときに型(クラスとインターフェース)をパラメーターにすることができます。メソッド宣言で使用されるよりよく知られている仮パラメータと同様に、型パラメータは、異なるコードで同じコードを再利用する方法を提供します。違いは、仮パラメータへの入力は値であり、型パラメータへの入力は型である点です。

非公式に:Javaのような強く型付けされた言語では、実行時ではなくコンパイル時にエラーが発生します。これは良いことです。しかし、それはコードの重複を引き起こします。このジェネリックを緩和するために、Javaに追加されました。

関連する問題