Javaで<T>(山かっこ)はどういう意味ですか?


139

私は現在Javaを勉強しており、最近山括弧(<>)に悩まされています。正確にはどういう意味ですか?

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

どういう<T>意味ですか?タイプのオブジェクトを作成できるということTですか?


4
コードを解析するのが難しいと思います。最初にインデントはなく、2つの開き中括弧と1つの閉じ中括弧があります。されたT createObjectプールやPoolFactory内のはず?どこにあるthis.freeObjects = ...はずですか?それは別の例ですか?そこにそれを置くことは違法です。メソッド内にある必要があります。
mgiuca

誰かが<>(ダイヤモンド演算子)に関する情報を探している場合は、docs.oracle.com/javase/7/docs/technotes/guides/language/…にList<Integer> list = new ArrayList<>();アクセスしてください
プシェモ2018年

回答:


161

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

とは何なのPoolPoolFactoryはわかりませんArrayList<T>が、標準Javaクラスであるにも言及しているので、それについて説明します。

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

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

  • Pool<String>はs を返すメソッドとのインターフェースPoolFactory<String>を持っているでしょう。createObjectString
  • 内部的には、文字列のPool<String>が含まれますArrayList

これは素晴らしいニュースです。別のときにPool<Integer>、同じコードを使用するを作成して、ソース内のIntegerどこにでも置くことができるTためです。


3
私がこれまでに見た中で最高の説明の1つ:)とても感謝しています!。
Suhas Chikkanna 2018

34

とても簡単です。これは、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>、実際には何でも書くことができ、同じように動作します。の<ABC>代わりに書いてみてください<T>

これは便宜上のものです。

  • <T> 任意のタイプと呼ばれます
  • <E> 要素タイプとして
  • <N> 数値型として
  • <V> 価値として
  • <K> キーとして

しかし、あなたはそれをあなたが好きな名前にすることができます、それは本当に重要ではありません。

また、IntegerStringBooleanなどどの助けコンパイル時の型のチェックでのJavaのラッパークラスです。たとえば、上記のコードでobjは、はタイプStringであるため、他のタイプを追加することはできません(試行obj.add(1)すると、エラーが発生します)。同様に、obj1Integerタイプは、他のタイプを追加することはできません(試行するとobj1.add("hello")、エラーが発生します)。


23

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

Javaのジェネリックの2つの主な利点は次のとおりです。

  1. プログラム内のキャストの数を減らし、プログラム内の潜在的なバグの数を減らします。
  2. コードの明快さの改善

11

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

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

総称パラメーターは、参照タイプのみにすることができます。したがって、int、double、charなどのプリミティブ型や他のプリミティブ型は使用できません。


9

<>Javaでジェネリックを示すために使用されます。

Tこの例では、型パラメーターです。そして何:インスタンス化は、あなたがいることをいくつかの一つではないことはできないでくださいT

上記のリンクされたチュートリアルとは別に、Angelika Langers Generics FAQはこのトピックに関する優れたリソースです。


8

ジェネリッククラスは、作成時にデータ型をパラメーターとして取り込むクラスの一種です。この型パラメーターは山括弧を使用して指定され、型はクラスの新しいインスタンスがインスタンス化されるたびに変更される可能性があります。たとえば、EmployeeオブジェクトのArrayListとCompanyオブジェクトの別のArrayListを作成してみましょう

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

同じArrayListクラスを使用して両方のリストを作成し、山括弧を使用してEmployeeまたはCompanyタイプを渡していることに気付くでしょう。1つのジェネリッククラスを使用すると、複数のタイプのデータを処理できるため、同様のタスクを実行する多くのクラスを削減できます。ジェネリックスは、コンパイラーがエラーを指摘するのに役立つ強力な型をすべて提供することで、バグを削減するのにも役立ちます。ArrayListのタイプを指定することにより、CompanyリストにEmployeeを追加しようとした場合、またはその逆の場合、コンパイラーはエラーをスローします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.