具有泛型类型参数可扩展的Cast接口

时间:2018-08-17 21:01:54

标签: java generics

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

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

但是,现在,如果我修改接口以使type参数必须扩展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 个答案:

答案 0 :(得分:1)

要了解为什么您的方法无法按预期方式工作,必须首先了解所使用的通配符-?,并具有泛型和强制转换的一些背景知识。

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

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

由于强制类型转换是开发人员篡改编译器控件的唯一方法,因此如果强制类型转换,您将告诉编译器您知道自己在做什么。如果您,您将获得运行时异常。


所有要说的...

如果您有类型化和绑定的泛型,则将<{>} 类型的任何Comparable元素放入Bar的方法。

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

    private Foo<T> foo;

    public void add(T object) {
        foo.add(object);
    }
}