3

次のように2つのコンストラクターをセットアップしています。

public XMessage(Information info, List<Object> results) {
    this.information = info;
    this.results = results;
}

public XMessage(Information info, Object result) {
    this(info, Collections.singletonList(result));
}

Information オブジェクトと ArrayList オブジェクトを渡して、XMessage オブジェクトを作成します。結果を調べると、ArrayList アイテムをラップするシングルトン リストです。Java がより適切なコンストラクターを使用しないのはなぜですか? また、それを強制するためのオプションは何ですか?

4

3 に答える 3

11

最初のコンストラクタを呼び出します:

new XMessage(information, new ArrayList<Object>());

2 番目のコンストラクターを呼び出します。

new XMessage(information, new ArrayList<String>());

ArrayList<String>()List<Object>はwhileとして扱われませんArrayList<Object>。次のコンストラクターの使用を検討してください。

public XMessage(Information info, List<? extends Object> results)

@LuiggiMendozaが以下に提案したように。

于 2012-05-17T21:37:45.330 に答える
1

List<String>がサブクラスではない (または代用可能でない)理由はList<Object>、呼び出し先が任意のオブジェクトをリストに追加したい可能性があり、List<String>タイプセーフであると想定されているためです。

単純に同一の入力を使用できない場合は、ここでオプションの詳細を読むことができます。

于 2012-05-17T21:47:48.047 に答える
0

上記の回答を試してみて、うまくいっていると思いましたが、最終的には誤検知でした。私はこのコンストラクターを使用しましたが、それは私のために働いています:

public XMessage(Information info, Object result) {
    this(info, result instanceof List ? (List<Object>) result : Collections.singletonList(result));
}
于 2012-05-18T14:38:17.533 に答える