0

像这样的声明:

  class A<X extends Number & List> {  } 

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

  class A<? extends Number & List> {  }

关于为什么 Java 限制我们这样做,有什么合乎逻辑的解释吗?

& 两者之间的实际区别是什么

      <T extends Number>  
     & <? extends Number>?
4

3 回答 3

3

如果您使用<? extends Number & List>,那么您将无法使用类型参数做任何事情。那就完全没用了。

同样,? extends Number当您不需要引用扩展 number 的类型并且不需要给它命名时,让您处理特殊情况。

于 2012-03-28T19:35:44.923 回答
1

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

于 2012-03-28T22:07:18.427 回答
0

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

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

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

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

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>等的东西。

于 2012-03-28T19:39:29.027 回答