6

私はついに、Java 7 が親切に生成した新しいコンパイラ警告をすべて取り除こうとしました。私はこれら2つを残しましたが、私には理解できません。それらを抑制せずにそれらを取り除く方法はありますか?

ジェネリックに型指定されたオブジェクトの配列を構築する (配列作成のどこに a を配置できますか?):

  static final int N = 10;
//warning: [unchecked] unchecked conversion
  static final Set<Widget>[] queued = new ConcurrentSkipListSet[N];
//required: Set<Widget>[]
//found:    ConcurrentSkipListSet[]

ジェネリック varargs (ジェネリック型の varargs を受け入れるほぼすべての場所で発生するようです):

class Foo<T> {
//warning: [unchecked] Possible heap pollution from parameterized vararg type T
  public void add(T... entries) {
//where T is a type-variable:
//T extends Object declared in class Foo

ところで:私はすでに持っています:

  // Add many entries to the list.
  public void add(List<T> entries) {
    // ...
  }

  // Add a number of entries.
  public void add(T... entries) {
    // Make a list of them.
    add(Arrays.<T>asList(entries));
  }
4

4 に答える 4

7

最初のものについて:

static final Set<Widget>[] queued = new ConcurrentSkipListSet<>[N];

Java 7 より前では、次のようにする必要があります。

static final Set<Widget>[] queued = new ConcurrentSkipListSet<Widget>[N];

ただし、おそらくこれを として宣言した方がよいでしょうArrayList<Set<Widget>>。一般に、Java で配列とジェネリックを混在させるのは少し難しいです。

static final List<Set<Widget>> queued = new ArrayList<>();
// or new ArrayList<Set<Widget>>();

2番目については、このスレッドを参照してください。メッセージを抑制することはできますが、実際には本当の危険について警告しています。そのスレッドの要点は、安全な方法は、メソッド シグネチャ (および対応する呼び出し) を次のように変更することです。

class Foo<T> {
    public void add(List<T> entries) {
        . . .

問題は基本的に最初のものと同じです: ジェネリックの配列を作成するべきではありません。

于 2013-03-21T16:05:48.273 に答える
2

@SafeVarargs2 番目の問題を解決するには、メソッド宣言に追加する必要があります。

javadocs から、これは次のとおりです。

アノテーション付きメソッドまたはコンストラクターの本体が、その varargs パラメーターに対して潜在的に危険な操作を実行しないというプログラマーの主張。このアノテーションをメソッドまたはコンストラクターに適用すると、具体化できない変数アリティ (vararg) 型に関する未チェックの警告が抑制され、呼び出しサイトでのパラメーター化された配列の作成に関する未チェックの警告が抑制されます。

于 2013-03-21T16:10:44.287 に答える
1

ジェネリックアレイの作成:

static final ConcurrentSkipListSet<Widget>[] queued = newArray(N);
// note: declare the most specific type for private objects


@SafeVarargs
static <E> E[] newArray(int length, E... array)
{
    return Arrays.copyOf(array, length);
}

仕組みnewArray-varargメソッドであるため、E[] array引数を渡す必要があります。したがって、メソッド本体はのタイプにアクセスできますE[]。これは理論的には正しいことであり、消去がなければ、実行時に完全にタイプセーフになります。消去を使用するとE[]、実行時に消去されたタイプのみが返されます。これで問題ありません。同じ消去されたタイプも返されます。

于 2013-03-21T17:52:17.943 に答える