2011-07-07 100 views
88

私は現在Javaを研究しており、最近、山括弧(<>)で困惑しています。それはどういう意味ですか?Javaで<T>(山括弧)は何を意味していますか?

public class Pool<T>{ 
    public interface PoolFactory<T>{ 
     public T createObject(); 
    } 
    this.freeObjects= new ArrayList<T>(maxsize) 
} 

<T>とは何ですか?それはタイプTのオブジェクトを作成できるということですか?

+8

google java generics –

+4

あなたのコードを解析するのは難しいです。開始のためのインデントはなく、2つの中括弧と1つの閉じるだけがあります。 'T createObject'はPoolまたはPoolFactoryの中にあるはずですか? 'this.freeObjects = ...'はどこにあるのでしょうか?これは別の例ですか?そこに置くことは違法です。それはメソッドの中になければなりません。 – mgiuca

+0

リスト list = new ArrayList <>();のように使用できる '<>'(ダイヤモンド演算子)に関する情報を探している人はhttps://docs.oracle.com/javase/7/docsをご覧ください/technotes/guides/language/type-in​​ference-generic-instance-creation.html。 – Pshemo

答えて

4

<>は、Javaでgenericsを示すために使用されます。

Tは、この例ではタイプパラメータです。そして、いいえ:インスタンス化は、とできない数少ないものの1つで、Tとなります。

Angelika Langers Generics FAQのリンク先のチュートリアルは別として、このトピックの素晴らしいリソースです。

6

はジェネリック型と呼ばれます。次のようにオブジェクトプールをインスタンス化できます。

PoolFactory<Integer> pool = new Pool<Integer>(); 

genericパラメータは参照型のみです。したがって、intやdoubleやcharやその他のプリミティブ型のようなプリミティブ型は使用できません。

101

<T>は、一般であり、通常「タイプT」と読むことができます。 <の左のタイプによって異なります>実際にはどういう意味か。

PoolまたはPoolFactoryは何かわかりませんが、標準のJavaクラスであるArrayList<T>もありますので、その点についてお話します。

通常、「T」は表示されません。別のタイプが表示されます。たとえば、ArrayList<Integer>が表示されている場合は、「ArrayListIntegerです」という意味です。多くのクラスはジェネリックを使用して、コンテナ内の要素のタイプを制約します。別の例はHashMap<String, Integer>です。これは、「StringキーとIntegerの値を持つマップ」を意味します。

あなたのプールの例は、がクラスを定義しているため、少し異なります。その場合、他の誰かがTの代わりに特定の型でインスタンス化できるクラスを作成しています。たとえば、クラス定義を使用してPool<String>という型のオブジェクトを作成できます。

  • マイPool<String>String秒を返すcreateObject方法とのインタフェースPoolFactory<String>を持っているでしょう:それは二つのことを意味します。
  • 内部的には、Pool<String>にはArrayListのStringsが含まれます。

別の時に、私は一緒に来て、同じコードを使用するPool<Integer>を作成していますが、ソースにTを参照してくださいどこIntegerを持っている可能性があるため、これは素晴らしいニュースです。

16

これはjavaのジェネリックに関連しています。私がArrayList<String>を述べた場合、そのArrayListにString型のオブジェクトだけを追加できることを意味します。

は、Javaにおけるジェネリック医薬品の2つの大きな利点があります:

  1. は、このように、あなたのプログラムの中で潜在的なバグの数を減らし、あなたのプログラムの中でキャストの数を減らします。
  2. コード明瞭度を改善
1

ジェネリッククラスは、それが作成されていますパラメータとして、データ型を取り込み、クラスのタイプです。この型パラメーターは角かっこで指定し、クラスの新しいインスタンスがインスタンス化されるたびに型を変更できます。たとえば、のは、EmployeeオブジェクトのためのArrayListを作成してみましょうし、会社のために別のオブジェクト

ArrayList<Employee> employees = new ArrayList<Employee>(); 
ArrayList<Company> companies = new ArrayList<Company>(); 

あなたは、我々は両方のリストを作成するために、同じArrayListクラスを使用していることに気づくでしょうし、私たちは角度を使用して、従業員や会社の種類に渡します角かっこ。 1つのジェネリッククラスは、同様のタスクを実行する多くのクラスを持つことにより、複数のタイプのデータを処理することができます。 ジェネリックスは、コンパイラがエラーを指摘するのに役立つ強力な型をすべて与えることで、バグを減らすのにも役立ちます。 ArrayListの型を指定すると、Companyリストに従業員を追加しようとすると、コンパイラはエラーをスローします。

10

これは本当に簡単です。これは、J2SE 5に導入された新機能です。クラス名の後ろに角カッコを指定すると、任意のタイプのデータを保持できる一時的なデータ型を作成していることを意味します。

例:

class A<T>{ 
    T obj; 
    void add(T obj){ 
     this.obj=obj; 
    } 
    T get(){ 
     return obj; 
    } 
} 
public class generics { 
    static<E> void print(E[] elements){ 
     for(E element:elements){ 
      System.out.println(element); 
     } 
    } 

    public static void main(String[] args) { 
     A<String> obj=new A<String>(); 
     A<Integer> obj1=new A<Integer>(); 
     obj.add("hello"); 
     obj1.add(6); 
     System.out.println(obj.get()); 
     System.out.println(obj1.get()); 

     Integer[] arr={1,3,5,7}; 
     print(arr); 
    } 
} 

代わりの<T>、あなたが実際に何かを書くことができますし、それは同じように動作します。 <T>の代わりに<ABC>と書きます。

これは単に便宜のためである:

  • <T>は、要素タイプ番号型として
  • <N>などの任意のタイプ
  • <E>と呼ばれる値として
  • <V>
  • キーとして
  • <K>

でも、名前を付けても問題ありません。

また、Integer,String,Booleanなどは、コンパイル時の型チェックに役立つJavaのラッパークラスです。たとえば、上記のコードでobjのタイプはStringなので、他のタイプを追加することはできません(obj.add(1)を試してみてください)。同様に、obj1Integerタイプですが、他のタイプを追加することはできません(obj1.add("hello")を試してみてください)。

関連する問題