10

私はまだジェネリックについて学んでいて、質問があります。このジェネリック クラスがあるとします。

public class Test<T> {

    public static void main (String[] args) {
        Test t1 = new Test();
        Test<String> t2 = new Test<String>();
        Test t3 = new Test<String>();
    }
}

すべてのステートメントはコンパイルされますが、何が異なるのかはよくわかりません。この 3 つのステートメントについて簡単に説明できる人はいますか。

4

3 に答える 3

9
Test t1 = new Test();

ここではRaw タイプを使用しています。Type argumentつまり、あなたの sに an を渡しませんgeneric clas

コンパイラはここで警告を表示する必要があります

テストは raw タイプです。ジェネリック型 Test への参照はパラメータ化する必要があります

    Test<String> t2 = new Test<String>();

ここではジェネリックを使用しています。String を として に渡しtype argumentますgeneric class

    Test t3 = new Test<String>();

コンパイラはここでも警告を出すはずです:

  • テストは raw タイプです。ジェネリック型 Test への参照はパラメータ化する必要があります

最初のケースと同じですが、コンストラクターの呼び出し中にパラメーター化された型を使用しています。

+Java 7 バージョンで正常に動作する別のクラスもあります。

    Test<String> t4 = new Test<>();

+ Java 7 を使用する場合、型推論によりコンパイラの警告は表示されません

この場合、ジェネリック型の導入によりtype inference推論されるため、コンストラクターの呼び出し中にジェネリック型を提供する必要はありません。

于 2013-02-22T11:45:52.740 に答える
3

ジェネリックは、コンパイル時の型チェックを提供します。

アイテムでできること/できないことの例を追加すると役立ちます (例を簡単にするために に変更TestArrayListました):

    ArrayList t1 = new ArrayList();
    ArrayList<String> t2 = new ArrayList();
    ArrayList t3 = new ArrayList<String>();

    // First list can have ANYTHING added to it
    // Compiler won't check because no generics
    t1.add(new Integer("7"));
    t1.add("Hello");

    // Second list can only have Strings added to it
    // Compiler will check and throw compile error for anything else
    t2.add(new Integer("7"));   // doesn't compile
    t2.add("Hello");

    // Third list is interesting...
    // Again, can have ANYTHING added to it
    // This is because generics (in Java...) are swapped out at COMPILE time
    //   rather than RUNTIME. The compiler can see that the actual type is just
    //   plain ArrayList
    // If you like, it's similar to doing: 
    //   Object o = (String) new Object(); 
    // The net-effect is everything reduced back to Object
    t3.add(new Integer("7"));  // fine
    t3.add("Hello");
于 2013-02-22T11:57:22.930 に答える
2

それらはすべて、実際には同一のオブジェクトを作成します。唯一の違いは、コードの残りの部分で構文的にどのように扱われるかです。

t1これらは同じ型であるため、まったく同じようにt3扱われます - それらは class を持つオブジェクトとして扱われ、Testそれ以上のものはありません。

t2型チェックの点でより厳密に扱われます。コンパイラがその一般的<String>な品質を利用する機会があれば、その品質も一致する必要があります。

于 2013-02-22T11:53:08.800 に答える