List <?>在java泛型中的含义是什么?

cor*_*ras 42 java generics bounded-wildcard

什么List<?>意思,它只是意味着一个未指定类型的对象列表?

谷歌搜索字符串<?>返回没有任何用处(:

Pop*_*ops 43

正如汤姆所说,这个?或无界的通配符意味着没有指定对象的类型.它可能是未知的,可能意味着多个可能的值,或者可能只是简单无关紧要.您的示例List<?>发音为"未知列表".它很方便,因为它很灵活,但也存在一些陷阱,因为你无法将随机物品推入并将它们从未知组中拉出来而完全不受惩罚.

资源:

  • 通配符讨论这里在Java教程.
  • 有一个很好的-如果冗长-教程由安格兰格可用一般的仿制药在这里.
  • 而且还有另外一个很好的概述,这里的吉拉德·布拉彻(PDF); 请查看第5-7页.
  • 最后,如果你可以通过Josh Bloch 开始使用Effective Java,那么它就有很多关于泛型的部分以及你可以,不能,应该和不应该使用通配符的情况(第5章,第109-146页)第二版).

顺便提一下,您的Google搜索失败了,因为Google没有使用特殊字符:

除了一些例外,标点符号被忽略(即,您无法搜索@#$%^&*()= + [] \和其他特殊字符).

- Google帮助页面

(编辑:我昨晚写这篇文章时一定很累.清理格式/添加一些信息.)


Chr*_*man 32

获取更多信息所需的关键字是通配符


Far*_*eki 6

要回答这个问题,我需要解释“无界通配符”和“有界通配符”。
这篇文章的内容是从Java文档中收集的。

1.无限通配符

无限制通配符类型使用通配符(?)指定,例如List<?>。这称为未知类型列表。在两种情况下,无界通配符是一种有用的方法:

  • 如果您正在编写一个可以使用Object类中提供的功能实现的方法。

  • 当代码使用泛型类中不依赖于type参数的方法时。例如,List.sizeList.clear。实际上,Class<?>之所以经常使用,是因为其中的大多数方法Class<T>都不依赖T

2.有界通配符

考虑一个简单的绘图应用程序,它可以绘制诸如矩形和圆形的形状。要在程序中表示这些形状,可以定义一个类层次结构,如下所示:

public abstract class Shape {
    public abstract void draw(Canvas c);
}

public class Circle extends Shape {
    private int x, y, radius;
    public void draw(Canvas c) {
        ...
    }
}

public class Rectangle extends Shape {
    private int x, y, width, height;
    public void draw(Canvas c) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这些类可以在画布上绘制:

public class Canvas {
    public void draw(Shape s) {
        s.draw(this);
   }
}
Run Code Online (Sandbox Code Playgroud)

任何工程图通常都会包含许多形状。假设它们表示为列表,那么在Canvas中使用一种方法将它们全部绘制将很方便:

public void drawAll(List<Shape> shapes) {
    for (Shape s: shapes) {
        s.draw(this);
   }
}
Run Code Online (Sandbox Code Playgroud)

现在,类型规则说drawAll()只能在完全Shape的列表上调用:例如,不能在上调用List<Circle>。不幸的是,因为所有方法所做的都是从列表中读取形状,因此也可以在上调用它List<Circle>。我们真正需要的是接受任何一种形状的列表的方法:public void drawAll(名单形状){...}这里有一个很小但很重要的区别:我们已更换型List<Shape>List<? extends Shape>。现在drawAll()将接受的任何子类的列表Shape,因此我们现在可以根据List<Circle>需要在上调用它。

List<? extends Shape>是有界通配符的示例。该?代表未知类型,然而,在这种情况下,我们知道这个未知的类型实际上是Shape的子类型。(注意:它可以是Shape本身,也可以是某些子类;它不需要扩展Shape。)我们说Shape是通配符的上限

同样地,语法? super T,这是一个有界通配符,表示一个未知的类型,它是T. A的超类型ArrayedHeap280<? super Integer>,例如,包括ArrayedHeap280<Integer>ArrayedHeap280<Number>,和ArrayedHeap280<Object>。正如您在Integer类Java文档中所看到的那样,Integer是Number的子类,而Number又是Object的子类。