3

私は次のJavaコードを書きました:

public static void main(String[] args) {
    Vector vector = new Vector();
    for(int i=1; i<=10; i++)
        vector.addElement(i);

    Enumeration vEnum = vector.elements();
    while(vEnum.hasMoreElements())
        System.out.println(vEnum.nextElement());
}

コンパイル中に次の警告メッセージが表示されます。

Note: TestJavaApplication.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

そして、「廃止されたコレクション」というメッセージで不平を言うNetbeans。

この状況で私に何をお勧めしますか?

要素の順序を格納する動的配列として、J2ME アプリケーションで Vector を使用する必要があることに注意してください。Hashtable を使用できれば幸いですが、残念ながら要素の順序は保存されません。

EDIT 1この回答を確認した 後、宣言を から に変更しVector vector = new Vector();ましたVector<String> vector = new Vector<String>();。そして、別の警告メッセージが表示されます:

TestJavaApplication.java:2: warning: com.sun.org.apache.xerces.internal.parsers.IntegratedParserConfiguration is Sun proprietary API and may be removed in a future release
import com.sun.org.apache.xerces.internal.parsers.IntegratedParserConfiguration;
                                                 ^

ありがとうございました。

4

2 に答える 2

9

「チェックされていない操作または安全でない操作」について表示される警告Vectorは、パラメーター化された型であるためです。実際にVector<E>は であり、 を使用するときは型引数を指定する必要がありますVector。「raw」を使用するとVector、Java のジェネリック フレームワークの利点がまったく得られません。「安全でない」という警告は、型の安全性が失われていることを意味します。

「時代遅れの型」の警告が表示されるのは、が (本質的に)およびその実装 (およびなど)Vectorを支持して廃止されたためです。ListArrayListLinkedList

さまざまなListタイプは、 の汎用代替品ですVectorArrayListは多かれ少なかれドロップインの代替として使用できますがVector、注意すべきいくつかの違いがあります。詳細については、javadoc を参照してください。

最も重要な違いは、VectorはスレッドセーフですがArrayList、 とはそうでLinkedListはないということです。組み込みのスレッドセーフに依存している場合はVector、メソッドを確認する必要がありますCollections.synchronizedList

編集: ああ、あなたは JavaME を使用しています。Vectorその場合、あなたはおそらく立ち往生しています。それでも、ジェネリック型の警告は引き続き適用されます。

必要に応じて、警告を無視できます。注意しないと問題が発生する可能性がありますが、注意していれば大丈夫だということを伝えるためにそこにいます。

于 2012-11-28T05:21:58.967 に答える
0

安全でない警告は、Vector とは特に関係ありません。ベクトルが何を含むべきかをコードが指定していないだけです。一般に、ベクトルの代わりに ArrayLists を使用する必要があり、おそらくコンテナーに入れる型も指定する必要があります。

Enumeration インターフェイスも時代遅れです。イテレータを優先する必要があります。実際、それらを利用する言語機能があります。たとえば、「新しい」for ループ。

注: 私は、J2ME がこれらの機能をサポートしていると仮定しています。そうでない場合は、「古いやり方」に問題はありません。それらは最適ではありません。

例 (J2ME 用ではなく、Java 5 以降用)

public static void main(String[] args) {
    ArrayList<Integer> vector = new ArrayList<Integer>();
    for(int i=1; i<=10; i++)
        vector.addElement(i);

    for(Integer i : vector)
        System.out.println(i);
}

gnat のコメントによると、上記のコードは 1.3 のサブセットである J2ME では機能しません。明らかに、ArrayList でさえサポートされていません。したがって、質問の例の元のコードは、進むべき道のように見えます。

于 2012-11-28T05:23:28.367 に答える