什么是问号? (在Java中不使用:)表示

时间:2014-09-27 04:18:51

标签: java rtti

我看到了一段代码:

public abstract List<Class<? extends Pet>> types();

(之前显示Class Dog和Cat继承自Class Pet) 问号是什么?在这里意味着什么?

2 个答案:

答案 0 :(得分:3)

这称为通配符,在定义泛型类型时很有用。从documentation

看一下这个例子
Collection<?> c = new ArrayList<String>();
c.add(new Object()); // Compile time error
  

由于我们不知道c的元素类型代表什么,我们无法向其添加对象。 add()方法接受类型为E的参数,即集合的元素类型。当实际类型参数为?时,它代表某种未知类型。我们传递给add的任何参数都必须是这种未知类型的子类型。由于我们不知道它是什么类型,因此我们无法传递任何内容。唯一的例外是null,它是每种类型的成员。

同样来自伟大的Java Generics FAQ

  

通配符描述了一系列类型。有3种不同风格的通配符:

  • “?” - 无界的通配符。它代表所有类型的家庭。
  • “?extends Type” - 带有上限的通配符。它代表所有类型的族,它们是Type的子类型,包括类型Type。
  • “?super Type” - 具有下限的通配符。它代表所有类型的族,它们是类型的超类型,包括类型类型。
  

通配符用于声明所谓的通配符参数化类型,其中通配符用作通用类型实例化的参数。在不需要或仅需要部分了解参数化类型的类型参数的情况下,通配符非常有用。

答案 1 :(得分:0)

?是一张外卡暗示&#34;任何东西&#34;。在您的示例中,它表示扩展Pet的所有类的列表。可能是狗或猫或任何宠物的动物