1

docs.oracle サイトで、ジェネリックを使用しない次のコード スニペットにはキャストが必要であることを読みました。

List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0);

しかし、ジェネリックでコードを書くと、それでもエラーが発生しやすくなります:

List<Object>= new List<Object>;
list.add("hello");
String s=(String)list.get(0);

それでは、ジェネリックの実際の使用法は何ですか....:(事前にthnx..

4

4 に答える 4

4
List<Object>= new List<Object>;
list.add("hello");
String s=(String)list.get(0);

する必要があります

List<String>= new ArrayList<String>();    // this is now a list of String, not a list of object
     ^^^^^^                 ^^^^^^
list.add("hello");
String s=list.get(0);    // no casting needed
         ^

必要なタイプでパラメータ化します。あなたの例は、最も基本的なクラスでパラメータ化するため、同じことを行う2つの方法です。

ジェネリックの利点は、ここで、1 つのクラスにより固有のクラスを記述できることStringです。これにより、コンパイルの早い段階でバグを検出するための型の安全性が向上します。これにより、キャスティング アプローチから生じる問題が回避されます。

于 2013-07-01T06:30:11.207 に答える
3

名前のリスト(文字列)を保存したいとします

List listNames = new ArrayList();
listNames.add("Durgesh");//ok

しかし、それに整数を追加することもできます

listNames.add(5000);//storing int instead of string

今これを行う

String name2=listNames.get(1);//throws exception{int->string}

ジェネリックがないと、コレクションに無効な型が追加され、コードが壊れる可能性があります。


ジェネリックを使用すると、問題を解決できます

List<String> listNames = new ArrayList();
listNames.add("Durgesh");
listNames.add(3000);//would through error at compile time

したがって、ジェネリックは型安全性を提供します


任意の種類のObject.DueList<Object>パラメーターを追加する場合は、任意の種類のオブジェクト (文字列、int) を追加できます。


また、x を y に変換できる場合、または y を x に変換できる場合List<x>は、代入 ( =) することはできません。また、その逆も同様です。List<y>

したがって、 ( )を に代入したり、その逆を代入したりすることはできません。=List<String>List<Object>

于 2013-07-01T06:34:49.990 に答える
3

ジェネリックを使用すると、コードがタイプ セーフになります。を防ぐことができClassCastExceptionます。

于 2013-07-01T06:30:54.903 に答える
1

ジェネリックは、コンパイル時に実行時例外を検出するために使用されます。

Listto storeを作成し、Stringsそれをメソッドに渡したと仮定します.. enhanceList(List).. 実行後、リストを反復処理してすべての文字列を取得します。

Genercisの前は、enhanceList(List)メソッドが他のタイプのオブジェクトをリストに追加する可能性がありましたClassCastException

void someMethod() {
   List listOfStrings = new List();
   enhanceList(listOfStrings);

   for(Iterator i : listOfStrings.iterator(); i.hasNext();) {
        String s = (String) i.next(); //RuntimeException here
   }
}

void enhanceList(List l) {
    l.add(new Integer(1)); //error code
}

genericsを使用すると、リストに含まれるオブジェクトのタイプを非常にうまく「バインド」できます

void someMethod() {
   List<String> listOfStrings = new List<String>();
   enhanceList(listOfStrings);

   for(String s : listOfStrings) {
       //no error here
   }
}

void enhanceList(List<String> l) {
    l.add(new Integer(1)); //compile-time error
}

ただし、ジェネリクスは注意して使用する必要List<Object>があります。バインディング タイプではあまり役に立ちません。これは、任意のオブジェクトを保持できるためです (オブジェクトはすべての Java クラスのスーパー クラスであるため)。常に特定のタイプのリストを作成することをお勧めします。

于 2013-07-01T06:36:38.993 に答える