我对Java很新,我对方法调用转换有疑问。
我创建了一个扩展ArrayList的新类,名为ListableList - 但这似乎不是问题。
问题是我有一个看起来像这样的方法
public static void printList(ListableList<Listable> list, String seperator){
for(Listable item : list){
System.out.println(seperator);
System.out.println(item.toList());
}
System.out.println(seperator);
}
我这样称呼这个方法:
Output.printList(rules, "..");
将规则初始化为
rules = new ListableList<Rule>();
规则实现Listable。
当我尝试编译时,我得到:
required: ListableList<Listable>,String
found: ListableList<Rule>,String
reason: actual argument ListableList<Rule> cannot be converted to ListableList<Listable> by method invocation conversion
为什么这个,从我学到的,这应该工作? 在此先感谢:)
答案 0 :(得分:7)
尝试将printList的方法签名更改为:
public static void printList(ListableList<? extends Listable> list, String seperator){
通用类型不是多态的,即{c},Listable<Listable>
不是List<Rule>
的超级类型,即使规则是sub-type
} 可列表。您必须在方法签名中使用generics with upper bounded wildcards来通知您的List可以接受任何可列表的子类型。请注意,如果您使用Generics with upperbounded wildcards
,则无法在列表中添加任何内容。即,
public static void printList(ListableList<? extends Listable> list, String seperator){
list.add(whatever); // is not allowed
答案 1 :(得分:2)
请使用:
public static void printList(ListableList<? extends Listable> list, String seperator){
这意味着list是一个只读集合,其中包含Listable的子类。
ListableList<Rule>
与ListableList<Listable>
不兼容,因为您可以将非规则对象添加到ListableList<Listable>
。
答案 2 :(得分:1)
方法声明应该与printList(ListableList<? extends Listable> list, String seperator)
类似。使其成为通用。