ArrayList的<a> conversion to ArrayList<b> when A implements B Java</b></a>

时间:2013-03-11 12:26:42

标签: java interface arraylist

我对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

为什么这个,从我学到的,这应该工作? 在此先感谢:)

3 个答案:

答案 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)类似。使其成为通用。