我有两个构造函数设置如下:
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不使用更合适的构造函数以及强制它的选项是什么?
答案 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));
}