为什么泛型类和方法声明中不能使用通配符?

问题描述 投票:0回答:3

这样的声明:

  class A<X extends Number & List> {  } 

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

  class A<? extends Number & List> {  }

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

& 之间的实际区别是什么

      <T extends Number>  
     & <? extends Number>?
java generics jvm bounded-wildcard
3个回答
3
投票

如果您使用

<? extends Number & List>
,那么您将无法使用类型参数进行 do 任何操作。 那就完全没用了。

同样,

? extends Number
可以让你处理特殊情况,当你不需要引用扩展数字的类型,并且不需要给它命名时。


2
投票

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


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>
等类型的内容。

© www.soinside.com 2019 - 2024. All rights reserved.