Java:集合中的接口未被识别为参数

时间:2010-12-16 08:46:26

标签: java generics inheritance interface

设计简单,代码简单但不编译:

public interface Insertable {
    public String getInsertStmt(String table);
}

public class ClassCanBeInserted implements Insertable { 
    public String getInsertStmt(String table) {}
}

public class SomeClass { 
    public static void main() { 
        List<ClassCanBeInserted> list = new ArrayList<ClassCanBeInserted>();
        SomeMethod(list);
    }
    private static void SomeMethod(List<Insertable> list) {}
}

对SomeMethod()的调用不会编译。英语很差,但代码应该解释。有人可以弄清楚出了什么问题以及如何设计一个可以在这种方法中使用接口实现类列表的设计?

再次,英语很差,所以可能表达不好。让我知道你的问题。谢谢!

给出错误信息: ClassCanBeInserted类型中的方法SomeMethod(List)不适用于参数(List)

2 个答案:

答案 0 :(得分:15)

List<Insertable>不是List<ClassCanBeInserted>的超类,即使InsertableClassCanBeInserted的超类。要执行您想要的操作,您应该将SomeMethod签名更改为SomeMethod(List<? extends Insertable> list)

答案 1 :(得分:1)

起初这似乎与直觉相反。

我想原因是泛型的全部意义在于引入和约束基于静态类型安全的列表。

如果你可以放任何&#39;可插入&#39;进入列表然后你可能会在那里混合不同类型的混合物。

这意味着您变得不安全并且存在ClassCastExceptions的风险。