3

我有两个这样的构造函数设置:

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>());

调用第二个构造函数:

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

ArrayList<String>()不被视为List<Object>while ArrayList<Object>is。考虑使用以下构造函数:

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

正如@LuiggiMendoza在下面建议的那样。

于 2012-05-17T21:37:45.330 回答
1

List<String>不是子类(或以其他方式替代) a的原因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 回答