为了账号安全,请及时绑定邮箱和手机立即绑定

具有扩展 Comparable 的泛型类型参数的强制转换接口

具有扩展 Comparable 的泛型类型参数的强制转换接口

慕标5832272 2021-07-16 18:19:24
    我有一个带有泛型类型参数的非常简单的接口。public interface Foo<T> {    void add(T element);}现在,我在这样的类中有一个这个接口的变量:public class Bar {    private Foo<?> foo;    public void action() {        Object o = new Object();        (Foo<Object> foo).add(o); // in my case i know that this will work    }}但是现在,如果我修改接口使得类型参数必须扩展Comparable<T>,我怎样才能达到和上面一样的效果?public interface Foo<T extends Comparable<T>> {    void add(T element);}public class Bar {    private Foo<?> foo;    public void action() {        Object o = new Object();        // compiler error, since Object does not extent Comparable        (Foo<Object> foo).add(o);    }}更新:我有很多类实现了这个接口,例如:public class IntFoo implements Foo<Integer> {    public void add(Integer element) {        // do something    }}在我的Bar班级中,我有一个Foo<?>,我想使用add(). 我已采取预防措施(例如使用instanceof),仅Integer在类型为 时添加Foo<Integer>。
查看完整描述

1 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

要了解为什么您的方法没有按照您期望的方式工作,您必须首先了解您使用的通配符 - ?,以及泛型与强制转换的一些背景知识。


带有通配符的泛型被视为“不关心”或“未知”类型;也就是说,您既不知道也不关心泛型中的类型,因为由于类型擦除,您以后无法检索它。


引入泛型是为了让我们免于麻烦或需要转换为我们想要的特定类型。我们可以定义一个同构类型并简单地处理它,而不是每次都必须强制转换。泛型允许我们在编译时处理由于错误类型转换而导致的不匹配类型,这意味着如果 Java 认为它是错误类型转换,代码甚至不会编译。


由于强制转换是开发人员从编译器中篡夺控制权的唯一方式,因此,如果您进行强制转换,则是在告诉编译器您知道自己在做什么。如果你不这样做,你会得到一个运行时异常。


说了这么多...


您将任何类型元素放入的唯一方法是,如果您有一个类型化和绑定的泛型。ComparableBar


public class Bar<T extends Comparable<T>> implements Foo<T> {


    private Foo<T> foo;


    public void add(T object) {

        foo.add(object);

    }

}


查看完整回答
反对 回复 2021-07-29
  • 1 回答
  • 0 关注
  • 169 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信