为什么Java不会在重载的构造函数情况下识别我的ArrayList

时间:2012-05-17 21:32:42

标签: java collections constructor

我有两个构造函数设置如下:

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不使用更合适的构造函数以及强制它的选项是什么?

3 个答案:

答案 0 :(得分:11)

调用第一个构造函数:

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

调用第二个构造函数:

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

List<Object>不被视为ArrayList<Object>。请考虑使用以下构造函数:

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

如下所示 @LuiggiMendoza

答案 1 :(得分:1)

List<String>不是List<Object>的子类(或者可替代)的原因是被调用者可能想要将任何对象添加到列表中,并且List<String>被认为是{{1}}为了安全。

如果您不能简单地使用相同的输入法,可以阅读有关您的选项here的更多信息。

答案 2 :(得分:0)

我尝试了上面的答案,并认为他们正在为我工​​作,但最终却是误报。我选择了这个构造函数,它为我工作:

public XMessage(Information info, Object result) {
    this(info, result instanceof List ? (List<Object>) result : Collections.singletonList(result));
}