类和类之间的区别<! - ? - >

时间:2009-06-17 13:38:23

标签: java generics

ClassClass<?>声明之间的区别是什么?

  • Class a;
  • Class<?> b;

4 个答案:

答案 0 :(得分:39)

与所有通用和原始类型相同:

Class          // An unknown class (raw type)
Class<?>       // An unknown class (generic version)
Class<String>  // The String class

在这种特殊情况下,ClassClass<?>之间没有太大的实际区别,因为它们都表示一个未知的类。根据现有的声明,编译器可以要求使用泛型类型而不是原始类型。

但是:从Java 1.5开始,您应该尽可能使用通用表单。 Class<?>清楚地表明你的意思是“一个未知的阶级”,Class<String>清楚地表明你的意思是String类。原始Class可能意味着两者

最后,它对编译器没有多大影响,但它使得代码的意图更容易理解和维护,这会产生很大的不同。

答案 1 :(得分:10)

班级javadoc

  

输入参数:   T - 由此Class对象建模的类的类型。例如,String.class的类型为Class<String>。如果正在建模的类未知,请使用Class<?>

使用不带类型参数的Class类似于使用任何通用类(MapList等)而不使用类型参数 - 要么是1.5之前的遗留用法或者它只是一段不关心未经检查的类型转换的代码。

答案 2 :(得分:2)

<?>表明您有意编写了不知道或不关心您正在处理哪个类的Java 5级代码。抛弃它使它看起来像旧代码或由尚未学习泛型的人编写的代码。

答案 3 :(得分:1)

&#34;它看起来像旧的代码或由尚未学习泛型的人编写的代码。&#34;这是一个正确的陈述。类(发音为&#34;未知类和#34;),即类型与任何类型匹配的类。出于显而易见的原因,它被称为外卡类型。

例如:

public void drawAll(List<Shape> shapes) {
    for (Shape s: shapes) {
        s.draw(this);
   }
}

类型规则说drawAll()只能在精确Shape的列表上调用:例如,它不能被调用,例如List<Circle>。这是不幸的,因为所有方法都是从列表中读取形状,所以它也可以在List<Circle>上调用。

我们真正想要的是接受任何形状列表的方法。

public void drawAll (List <? extends Shape> shapes) {

}

了解详情:http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html