【问题标题】:Why Wild Cards can't be used in generic class & method declaration?为什么通用类和方法声明中不能使用通配符?
【发布时间】:2012-03-28 19:23:07
【问题描述】:

这样的声明:

  class A<X extends Number & List> {  } 

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

  class A<? extends Number & List> {  }

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

&

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

【问题讨论】:

  • 你真的有一个扩展Number并实现List的类吗?还是扩展Number 并实现List&lt;Number&gt;?还是 X 扩展 Number 并实现 List&lt;X&gt;?你怎么写最后一个而不在某处声明类型X
  • 好点——NumberList 并不是你希望像那样共存的真正类型。
  • @LouisWasserman:即使它们确实像那样共存,我只是指出您可能需要通用定义来指定您的列表所包含的内容。无论哪种方式,最好避免使用原始类型。
  • @PaulHanbury: 测试和编译成功。Number & List 只是举例。你可以用任何自定义的类名,接口名替换它们。这里的重点是为什么不允许使用通配符在泛型类/方法声明中。
  • @DebadyutiMaiti:按照您的逻辑,我应该对以下代码感到满意,因为它可以编译并通过测试:public class Math {public static int multiply(int x,int y){int p = 0;for(int i=0;i&lt;x;i++) for(int j=0;j&lt;y;j++)p++;return p;}} 我对此不满意。同样,我认为使用原始列表也不是一个好主意……尤其是在模板类中。

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


【解决方案1】:

如果您使用&lt;? extends Number &amp; List&gt;,那么您将无法执行任何使用类型参数的操作。完全没用。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      class Weird extends Number implements List {
          //
      }
      
      Foo<Weird> f = new Foo<Weird>();
      f.doStuff(...);   // wants a List<Weird>
      

      如果我们在 f 上调用 doMoreStuff(),我们可以给它一些 List&lt;OutputStream&gt;List&lt;FilterOutputStream&gt;List&lt;ByteArrayOutputStream&gt; 等类型的东西。

      【讨论】:

      • 你不应该在 Foo 上打电话给doStuff(),这不奇怪吗?
      猜你喜欢
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 2018-02-20
      • 2021-12-22
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多