繁体   English   中英

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

[英]Cast interface with generic type parameter extending 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 )仅在类型为Foo<Integer> instanceof添加一个Integer

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

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

引入泛型是为了避免麻烦或需要转换为我们想要的特定类型。 我们可以定义一个同构类型,并简单地处理 ,而不必每次都强制转换。 泛型使我们能够处理由于编译时转换错误而导致的类型不匹配的情况 ,这意味着如果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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM