5

リストが必要な場合(たとえば)、次のように作成します。

List<String>

ジェネリック型のリストを作成したい場合は、次のように行うことができます。

MyList<T>

では、<>が行うのは、オブジェクトをコンテナまたはリストと結合することだけですか?他の用途はありますか?それは実際に何をしますか?別の投稿で、ジェネリック型に静的メソッドを配置することは型の安全性にとって悪いことであるということを読んでいましたが、これは悪いコードですか?

public class LinkList<T> {

private final T t;
private final LinkList<T> next;

public LinkList(T t, LinkList<T> next){
    this.t = t;

    this.next = next;
}
// Creates list from array of T
public static <T> LinkList<T> getList(T[] t){
    if(t == null){
        return null;
    }
    LinkList linkList = null;
    for(int i = t.length-1; i >= 0; i--){
        linkList = new LinkList(t[i], linkList);
    }
    return linkList;
}

public T element() {
    return t;
}

public LinkList<T> getNext() {
    return next;
}

}

4

4 に答える 4

10

<>コンパイラが型安全性を検証するのに役立ちます。

コンパイラは、実行時ではなくコンパイル時にList<MyObj>型のオブジェクトを確実に保持します。MyObj

ジェネリックは、主にコンパイル時のタイプ セーフを目的としています。型の消去により、すべてのジェネリック情報はコンパイル後に具象型に置き換えられます。

于 2012-08-09T20:39:20.360 に答える
6

内部に型を入れる<>と、潜在的な実行時例外をコンパイル エラーに変換するために使用されます。

ジェネリックなしのこのコードを例にとります

ArrayList stringList = new ArrayList();
stringList.add("string");
stringList.add(3.4);
String s = (String) stringList.get(1);

// これはコンパイルされ、String と double を比較すると実行時エラーが発生します。

ジェネリックを追加すると、これらのバグを作成時に見つけることができます。

次のコードを検討してください。

ArrayList<String> stringList = new ArrayList<String>(); // Since Java 7 you can write - new ArrayList<>()
stringList.add("string"); // OK
stringList.add(3.4); // Would not compile!

このようにして、コンパイル時に型関連のエラーをキャッチできます。

コンパイラ自体は、ジェネリックを使用したかどうかを気にしません。コンパイル時にそれらをすべて削除し、ジェネリックを使用していないかのように動作します。ただし、そもそもコンパイル エラーがある場合はコンパイルできません。

また、コードに関するあなたの質問に答えていないことにも気付きました。

このようなことをすると

class LinkedList<T> {
....
.... 
}

このクラスがジェネリックをサポートしていることをコンパイラに伝えます。その場合、上で述べたことを実行できます。

あなたができる

LinkedList<String> list = new LinkedList<String>();

さて、あなたのクラスのどこにいてもT、それはあたかもそれがそうであるかのように動作すると言われているStringため、文字列の追加とメインプレートのみが許可されます。

于 2012-08-09T20:44:37.247 に答える
1

<>genericsと呼ばれるクールな機能に使用されます。

Java 5 より前は、ジェネリックは存在しませんでした。ArrayList返された、操作されたなどのコレクションObjectsStringこれに関する問題は、たとえば sのみを保存することがわかっている場合です。しかしObjects、すべてのクラスで作業している場合、迷惑なキャスト ( String blah = (String) list.get(9);) を使用する必要があるだけでなく、エラーを犯しIntegerてリストに を追加すると、プログラムがClassCastException燃えてしまいます。

Java 5 はこれをジェネリックで解決したので、これでsArrayList<String>のみを使用すると言うことができます。しかし、あなたが作る必要がある場合はどうしますか?明らかに、タイピングは快適な体験ではありません。特にタイピングしなければならない場合はなおさらです。StringArrayListArrayList<Supercalifragilisticexpealidocious>

ArrayList<Supercalifragilisticexpealidocious> supercaliList = new ArrayList<Supercalifragilisticexpealidocious>();

これらのいずれかを宣言します。さらに、特にこのサイズの型パラメーターでは、タイプミスにつながる可能性があります。ある時点で、文字を 1 つか 2 つ間違えてプログラムcannot find symbolを焼損させたり、さらに悪いことに、黙って間違ったクラスを使用して論理エラーを引き起こしたりすることになります。

Java 7 ではプレーンな<>構文が導入されています。これはひし形演算子<>と呼ばれ、代入演算子の右側にある型パラメーター ( 内のもの) を再入力する必要がないようにします。したがって、

ArrayList<Supercalifragilisticexpealidocious> supercaliList = new ArrayList<Supercalifragilisticexpealidocious>();

になる

ArrayList<Supercalifragilisticexpealidocious> supercaliList = new ArrayList<>();

つまり、再入力の時間が大幅に短縮されSupercalifragilisticexpealidociousます。

お役に立てれば!

于 2013-03-15T00:05:13.610 に答える
0

<> は、コンテナだけでなく、任意のクラスで使用できます。コンテナに必要なあらゆる種類のオブジェクトを格納し、タイプ セーフを維持できるようにするため、これらは単純に最も一般的です。これをより深く理解するには、ジェネリックとその用途を調査する必要があります。

于 2012-08-09T20:42:35.777 に答える