4

コードの何が問題なのかよくわかりません...

    public Vector blob (Pixel px)
{
    Vector v = new Vector();

    Point p = new Point(px.getX(), px.getY());
    v.add(p);

    return v;
}

次のメッセージが表示されます。警告:[unchecked] unchecked call to add(E)as a member of raw type Vector

v.add(p);

ここで、Eは型変数です。Eは、Vectorクラスで宣言されたObjectを拡張します。

APIを見ると、add関数はオブジェクトをパラメーターとして受け取ります。これは、前に明確に線を引いたものです。

4

4 に答える 4

6

Java-5以降java.util.Vector<E>は、ジェネリックコンテナーです。つまり、(非常にわかりやすい言葉で)格納する予定の要素のタイプを指定し、コンパイラーにそのタイプを自動的にチェックさせることができます。要素のタイプなしで使用しても問題ありませんが、警告がトリガーされます。

これにより、警告がなくなり、追加の型安全性チェックが提供されます。

public Vector<Point> blob (Pixel px) {
    Vector<Point> v = new Vector<Point>();
    Point p = new Point(px.getX(), px.getY());
    v.add(p);
}

ベクトルについて注意すべきもう1つの点は、それらが同期されたコンテナーであるということです。それらが同期されているという事実を使用する予定がない場合は、ArrayList<E>コンテナーを使用した方がよい場合があります。

于 2012-07-16T15:54:37.833 に答える
5

ジェネリック!!!。ベクトルのコンテンツのオブジェクトタイプを指定する必要があります。警告を削除するには、ベクトルコードは次のようになります

Vector<Point> v=new Vector<Point>()
于 2012-07-16T15:53:16.540 に答える
3

なぜならgenericsGenericsコンパイラがコンパイル時に型をチェックする型の安全性を可能にします。raw typesジェネリックパラメーターのクラス/メソッドを使用している場合、この警告が表示されます。

生の型は、ジェネリックパラメーターの具体的な実装を提供しないものです。

この場合、ベクトルクラスのaddメソッドは「generic」であり、これにより、addメソッドが受け入れる具体的な実装タイプを指定できます。

下位互換性を確保するために、Javaでは「raw型」を定義できます。詳細については、このドキュメントをお読みください。

于 2012-07-16T15:53:44.323 に答える
0

JavaGenericsを使用するのを忘れています。

簡単な答え:代わりに宣言する Vector<Pixel > v = new Vector<Pixel >()
Vector v = new Vector()

長い答え: ジェネリックについて読み、その使用法を理解する

また、ベクターの使用法を再検討することもできます。これが理由を説明するSOリンクです。

于 2012-07-16T15:55:48.240 に答える