0

任意のタイプでインスタンス化できる変数、たとえばリストが必要な場合はどうすればよいでしょうか?

したがって、与えられた:

List list;

私はこれらのいずれかを行うことができます:

list = new ArrayList<String>();
list = new Vector<Integer>();
list = new LinkedList<HashMap>();

編集:または、生のリストを返すライブラリを使用している可能性があります。たとえば、休止状態では次のようになります。

List result = session.createQuery( "from Event" ).list();

Eclipse は、使用したいときに次の警告を表示しますList list

リストは生の型です。ジェネリック型への参照List<E>はパラメーター化する必要があります

なぜこれを避ける必要があるのですか?

4

6 に答える 6

4

上記を実行しようとすると、Eclipse から次のエラーが表示されます。

私は、日食がエラー (赤い下線) ではなく、警告 (黄色の下線) を与えると信じています。

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

なぜこれを避ける必要があるのですか?

ジェネリック型への参照は、強力な型付けを提供するため、パラメーター化する必要があります。これは、実行時にしか検出されない問題をコンパイル時に検出するのに役立ちます。

例えば:

List myIntegerList = new ArrayList();
myIntegerList.add(1);
myIntegerList.add("bad bad String");

問題なくコンパイルされます。しかし、実行時にエラーが発生します。反対側:

List<Integer> myIntegerList = new ArrayList<Integer>();
myIntegerList.add(1);
myIntegerList.add("bad bad String"); // compiler will show an error here

Stringを に追加しようとすると明確なエラーが表示されるため、決してコンパイルされませIntegerList

于 2013-04-12T04:14:52.557 に答える
1

何かをすることができるからといって、それが賢明であるとは限りません。ArrayList<String>異なる時点で、 、Vector<Integer>および である可能性があるオブジェクトは、どのような状況下にありますLinkedList<HashMap>か? 異なるタイプのオブジェクトには、異なる目的があります。List<String>おそらく、インスタンス変数、List<Integer>インスタンス変数、およびインスタンス変数を持つクラスが必要になるでしょうList<Map<K, V>>。その後、問題は解決します。

あなたが提案したことを実行することは、同僚にとって非常に不愉快な驚きとなるでしょう。彼らを幸せにしてください。あなたの良い記憶力を示すために彼らを悩ませないでください。そして、今から 6 か月後に、今日書いたコードを理解できると思いますか? Google またはこのサイトIOCCCで調べてください。これらのプログラムは、ベスト プラクティスのパラダイムではなく、賢く作成されています。

于 2013-04-12T04:04:16.890 に答える
0

これを試してみてください。オブジェクトをリストに拡張するものは何でも受け入れます。

List<? extends Object> list;
list = new ArrayList<String>();
list = new Vector<Integer>();
list = new LinkedList<Map>();
于 2013-04-12T04:17:44.957 に答える
0

リスト オブジェクトではなく arraylist のみをパラメータ化したため、この警告が表示されます。したがって、ジェネリックと非ジェネリックが混在しています。これにより、ランタイム キャスト例外が発生し、ジェネリックの目的が果たせなくなる可能性があります。

List<String> list = new ArrayList<>();  //If JDK7, not back comptible

List<String> list = new ArrayList<String>();  //If <=JDK7, back compatible

例えば

List<Integer> list1 = new ArrayList<>();
List list2 = new ArrayList<Integer>();

両方のリストの追加機能を実行しようとすると、違いがわかります。

list1.add("sdfsdfd"); //Takes only integer inputs, compilation error
list2.add(obj); //Takes object type, since obj is not integer type, so will throw classcastexception
于 2013-04-12T03:56:48.123 に答える
-1

以下のコードで問題ありません。

List<?> list; また

List<? extends Object> list;

Javaでの疑問符(?)の使い方については、ワイルドカード (Java)を参照してください。

于 2013-04-12T04:27:05.703 に答える