为什么Wild Cards不能用于泛型类&方法声明?

时间:2012-03-28 19:23:08

标签: java generics compiler-construction jvm bounded-wildcard

这样的声明:

  class A<X extends Number & List> {  } 

是允许的。不允许这样的声明。

  class A<? extends Number & List> {  }

有没有合理的解释为什么Java限制我们这样做?

&安培;

之间的实际区别是什么
      <T extends Number>  
     & <? extends Number>?

3 个答案:

答案 0 :(得分:3)

如果您使用<? extends Number & List>,那么您将无法使用type参数执行任何操作。它完全没用。

类似地,? extends Number允许您在不需要引用扩展数字的类型时处理特殊情况,并且您不需要为其命名。

答案 1 :(得分:1)

T这样的类型参数的重点是,您可以将其用作类中的类型。那里的通配符甚至意味着什么?如果你不能在任何地方使用它,为什么还要有一个类型参数?

答案 2 :(得分:0)

泛型类和接口声明需要类型参数,例如T或U.是一个通配符,更适用于本身通用的方法参数:

class Foo<T extends Number & List> {
    void doStuff(List<T> items) {
        // ...
    }

    void doMoreStuff(List<? extends OutputStream> streams) {
        // ...
    }
}

doStuff()表示它想要在List<T>上操作,其中T是类Foo上的类型参数。所以:

class Weird extends Number implements List {
    //
}

Foo<Weird> f = new Foo<Weird>();
f.doStuff(...);   // wants a List<Weird>

如果我们在f上调用了doMoreStuff(),我们就可以提供List<OutputStream>List<FilterOutputStream>List<ByteArrayOutputStream>等类型的东西。