【问题标题】:What's the difference between wildcard and 'T'? [duplicate]通配符和“T”有什么区别? [复制]
【发布时间】:2014-06-10 07:05:25
【问题描述】:
    public <? extends Animal> void takeThing(ArrayList<?> list)
    public <T extends Animal> void takeThing(ArrayList<T> list)

为什么这个说法是错误的?我的意思是为什么?不能在前面使用?但是T 可以。有什么区别?

可能重复的“When to use wildcards in Java Generics?

这是这个问题的答案。但我不明白这是什么意思。 “如果您说 void 则没有返回类型。如果您指定则有返回类型。我不知道您可以指定有返回类型还是没有返回类型。”

【问题讨论】:

标签: java


【解决方案1】:

编写&lt;T extends Animal&gt;绑定类型名称T,以便稍后在定义中引用它(包括在参数列表中)。

如果你写了&lt;? extends Animal&gt;,那么你没有命名类型。因此,您以后不能参考它。您不能稍后将其称为?,因为这可能会模棱两可(如果您有两个类型参数怎么办?)。

Java 禁止你写public &lt;?&gt; ...,因为这样的声明是没有用的(类型参数没有命名所以不能使用)。

【讨论】:

    【解决方案2】:
    public void takeThing(ArrayList<? extends Animal> list)
    

    表示“用Animal任何 子类列表做某事”。

    public <T extends Animal> void takeThing(ArrayList<T> list)
    

    的意思是“用Animal一些特定的子类(A.K.A. T)的列表做一些事情”。

    如果我在第一个方法上调用list.get(),我所知道的返回类型是它扩展了Animal。在第二种方法中,如果我有另一个 List&lt;T&gt; 实例,我知道无论 T 是什么类型,两个列表都会接受相同的类型。

    更进一步,如果我说

    Animal animal = list.get(0);
    

    我不能再说了

    list.add(animal);
    

    即使在同一个列表中,因为我们没有对泛型子类型的引用。但是,如果我声明 List&lt;T&gt;&lt;T extends Animal&gt;,我现在可以说

    T animal = list.get(0);
    list.add(animal);
    

    因为我们知道list 需要T 类型的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 2019-08-08
      • 2013-02-23
      相关资源
      最近更新 更多