当前位置: 首页 > 面试题库 >

何时在Java泛型中使用通配符?

皇甫聪
2023-03-14
问题内容

这是来自 HeadFirst Java的 :(第575页)

这个:

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

做与此相同的事情:

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

所以这是我的问题:如果它们完全相同,我们为什么不写

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

要么

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

另外,什么时候使用?是有用的?而不是使用泛型的方法声明(如上所述)中的T或用于类声明?有什么好处?


问题答案:

之间的最大区别

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

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

是在前一种方法中,您可以在方法中将“ T”作为给出的具体类。在第二种方法中,您无法执行此操作。

这里有一个更复杂的例子来说明这一点:

// here i can return the concrete type that was passed in
public <T extends Animal> Map<T, String> getNamesMap(ArrayList<T> list) {
    Map<T, String> names = new HashMap<T, String>();
    for (T animal : list) {
        names.put(animal, animal.getName()); // I assume there is a getName() method
    }
    return names;
}

// here i have to use general Animal
public Map<Animal, String> getNamesMap(ArrayList<? extends Animal> list) {
    Map<Animal, String> names = new HashMap<Animal, String>();
    for (Animal animal : list) {
        names.put(animal, animal.getName()); // I assume there is a getName() method
    }
    return names;
}

使用第一种方法,如果您传递“猫的清单”,您将获得一个以猫为键的地图。第二种方法将始终返回带有常规Animal键的Map。

顺便说一句,这是无效的Java语法:

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

使用这种形式的泛型方法声明,您必须使用有效的Java标识符,而不是“?”。

编辑:

形式“?extended Type”仅适用于变量或参数类型声明。在通用方法偏斜内,它必须是“标识符扩展类型”,因为您可以从方法内引用“标识符”。



 类似资料:
  • 问题内容: 我对Java中的通用通配符有两个疑问: 和之间有什么区别? 什么是有界通配符,什么是无界通配符? 问题答案: 在你的第一个问题中,并且是有界通配符的示例。无限制的通配符看起来像,基本上就是<? extends Object>。宽松地表示泛型可以是任何类型。有界通配符(或)通过说它必须扩展特定类型(称为上限)或必须是特定类型的祖先(称为下限)来对类型进行限制。

  • 所以我在阅读泛型以重新熟悉这些概念,尤其是在涉及通配符的地方,因为我很少使用或遇到通配符。从我的阅读中,我不明白他们为什么使用通配符。下面是我经常遇到的一个例子。 你为什么不这样写: oracle网站上的另一个示例: 为什么这不是写成 我错过什么了吗?

  • 这2个功能有什么区别? 我看到了相同的输出。

  • 在试图理解java泛型类型和通配符“?”的用法时,我尝试了以下方法: 我得到以下编译错误(使用Oracle JDeveloper作为IDE): 为什么上面的代码不能编译,而赋值却可以呢?另外,如果我想调用,什么是可接受的参数值?

  • 本文向大家介绍Java 泛型总结(三):通配符的使用,包括了Java 泛型总结(三):通配符的使用的使用技巧和注意事项,需要的朋友参考一下 简介 前两篇文章介绍了泛型的基本用法、类型擦除以及泛型数组。在泛型的使用中,还有个重要的东西叫通配符,本文介绍通配符的使用。 这个系列的另外两篇文章: Java 泛型总结(一):基本用法与类型擦除 Java 泛型总结(二):泛型与数组 数组的协变 在了解通配符