【问题标题】:Java: interface in collection not recognized as parameterJava:集合中的接口未被识别为参数
【发布时间】:2010-12-16 08:46:26
【问题描述】:

简单的设计和简单的代码但不能编译:

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)

【问题讨论】:

    标签: java generics inheritance interface


    【解决方案1】:

    List&lt;Insertable&gt; 不是List&lt;ClassCanBeInserted&gt; 的超类,尽管Insertable 是ClassCanBeInserted 的超类。做你想做的事,你应该把 SomeMethod 签名改成SomeMethod(List&lt;? extends Insertable&gt; list)。

    【讨论】:

    • 谢谢,这帮助我解决了我的问题。另外,如果你想在你的函数中声明一个泛型类型的对象,你可以用public static &lt;T extends Insertable&gt; void SomeMethod(List&lt;T&gt; list) {}声明你的函数。然后,您可以使用 T varName; 声明该类型的变量
    【解决方案2】:

    乍一看,这确实违反直觉。

    我猜原因是泛型的重点是基于静态类型安全性引入和约束列表。

    如果您可以将任何“可插入”放入列表中,那么您最终可能会在列表中混合不同的类类型。

    这意味着您变得不安全并且有发生 ClassCastExceptions 的风险。

    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多