2

次のコード セグメントがあります。

public void reorder(int fromIndex, int toIndex) {
    getElements().add(toIndex, getElements().remove(fromIndex));
}

ここで、メソッドgetElementsの戻り値の型はList<?>です。removeメソッドには戻り値の型が?あり、addメソッドはその引数を として示しますint index, ? elementremoveメソッドの戻り値の型とメソッドの 2 番目の引数がadd同じであるため、私の仮定は、?メソッド呼び出しが成功する必要があるということでした。しかし、私は間違っていました.上記のコードセグメントはエラーになります:

The method add(int, capture#17-of ?) 
in the type List<capture#17-of ?> 
is not applicable for the arguments (int, capture#18-of ?)

getElementsここでは、リストに直接アクセスすることはできず、メソッドによって返された元の型かどうかもわかりません。ここで必要なのは、アイテムを で削除してfromIndexに配置することだけtoIndexです。それで、どうすればそれを達成できますか?また、ジェネリックの理解に何か問題がありますか?

4

3 に答える 3

2

?その具象を作るキャストを追加するだけです:

public void reorder(int fromIndex, int toIndex) {
  final List<Object> els = (List<Object>)getElements();
  els.add(toIndex, els.remove(fromIndex));
}

リスト内の要素を並べ替えているだけなので、これで問題が発生することはありません。しかし、そのような戻り値が表示されている場合は、設計に問題があると言わざるを得ません。

于 2012-05-11T09:04:15.600 に答える
1

ワイルドカードは、特定の 1 つのタイプではなく、任意の (不明な) タイプ?を意味します。そのため、コンパイラは、呼び出しで使用されている any 型がand呼び出しで使用されているanyと同じであることを確認できません。これはエラー メッセージからわかります。前者は 、後者はと記述されています。これらは、コンパイラによって 2 つの異なる、無関係な型として認識されます。removegetElementsaddcapture#18-of ?capture#17-of ?

これらのメソッドの定義を変更することは明らかにできないため (説明に基づいて明らかに怪しいように見えますが)、ここでの最悪のオプションはおそらく @Marko が提案するものです: プロセスの 2 つのステップを分離し、temp 変数をObjectコンパイラを満足させる具体的な型パラメータ ( )。

于 2012-05-11T09:08:29.983 に答える