2009-06-17 122 views

回答

34

这是相同的所有通用的和原始类型:

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

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

但:自Java 1.5以来,您应该尽可能使用通用表单。 Class<?>明确指出你的意思是“未知类”,Class<String> cleary指出你的意思是String类。原料Class可能意味着均为

最后它对编译器没有什么区别,但它使代码的意图更易于理解和维护。

+2

应该避免Class类尽可能... – 2009-06-17 13:53:41

10

javadoc

类型参数: T - 通过此Class对象建模的类的类型。例如,String.class的类型是Class<String>。如果正在建模的类未知,则使用Class<?>

不带类型参数使用Class类似于使用任何通用类(MapList等),而不类型参数 - 无论它是一个预1.5遗留使用或它只是一个的代码,不会段不关心未经检查的类型转换。

2

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

1

“它看起来像旧的代码或由尚未学习泛型的人编写的代码。”这是一个正确的说法。类(发音为“未知类”),即类型匹配任何内容的类。由于显而易见的原因,它被称为通配符类型。

例如:

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

相关问题