代码之家  ›  专栏  ›  技术社区  ›  Glains

具有扩展可比较的泛型类型参数的转换接口

  •  0
  • Glains  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  1
  •   Makoto    6 年前

    为了理解为什么你的方法没有达到预期的效果,你必须首先理解你使用的通配符- ? ,还有一些关于泛型和铸造的背景知识。

    带有通配符的泛型被视为“不关心”或 "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);
        }
    }