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

    我有一个带有泛型类型参数的非常简单的接口。


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>。


慕标5832272
浏览 170回答 1
1回答

PIPIONE

要了解为什么您的方法没有按照您期望的方式工作,您必须首先了解您使用的通配符 - ?,以及泛型与强制转换的一些背景知识。带有通配符的泛型被视为“不关心”或“未知”类型;也就是说,您既不知道也不关心泛型中的类型,因为由于类型擦除,您以后无法检索它。引入泛型是为了让我们免于麻烦或需要转换为我们想要的特定类型。我们可以定义一个同构类型并简单地处理它,而不是每次都必须强制转换。泛型允许我们在编译时处理由于错误类型转换而导致的不匹配类型,这意味着如果 Java 认为它是错误类型转换,代码甚至不会编译。由于强制转换是开发人员从编译器中篡夺控制权的唯一方式,因此,如果您进行强制转换,则是在告诉编译器您知道自己在做什么。如果你不这样做,你会得到一个运行时异常。说了这么多...您将任何类型元素放入的唯一方法是,如果您有一个类型化和绑定的泛型。ComparableBarpublic class Bar<T extends Comparable<T>> implements Foo<T> {&nbsp; &nbsp; private Foo<T> foo;&nbsp; &nbsp; public void add(T object) {&nbsp; &nbsp; &nbsp; &nbsp; foo.add(object);&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java