4

コードを検討してください:

public List<Products> listProducts(){

    ...

    return (List<Products>) query.list(); // returning a list containing Products objects
    }

メソッドの戻り値の型でのジェネリックの使用は、次のように常に推奨されます。

public List<Products> listProducts(){
...
}

1)しかし、 return ステートメントでジェネリックを使用することが望ましいですか?

なので:

return (List<Products>) query.list();

2)次のように return ステートメントで単純なリストを使用することに害はありますか?

return (List) query.list();
4

1 に答える 1

6

生の型に関するコンパイラの警告を除いて、問題はありません。基になる型が一貫していない場合、いくつかの楽しいことが発生する可能性があります。次の状況を想定します。

public static ArrayList<String> foo() {
    ArrayList<String> arrlist = new ArrayList<String>();        
    arrlist.add("asdf");
    return arrlist;
}

public static List<Integer> bar() {
    return (List)foo();
}

public static void main(String[] args) {

    List<Integer> list = bar();     
    System.out.println(list.get(0).doubleValue());
}

実行時例外が発生します。

スレッド「メイン」の例外 java.lang.ClassCastException: java.lang.String は、test.Test.main(Test.java:13) で java.lang.Integer にキャストできません

代わりに使用した場合:

public static List<Integer> bar() {
    return (List<Integer>)foo();
}

コンパイラは不平を言ったでしょう:

Type mismatch: cannot convert from ArrayList<String> to List<Integer>

結論: ジェネリックを使用することは常に良い考えです。実行時の頭痛の種をいくらか減らすことができるからです。

于 2012-09-05T07:08:28.867 に答える