繁体   English   中英

Class和Class的区别<!--?-->

[英]Difference between Class and Class<?>

ClassClass<?>声明有什么区别。

  • Class a;
  • Class<?> b;

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

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

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

但是:从 Java 1.5 开始,您应该尽可能使用通用形式。 Class<?>明确表示您的意思是“未知类”, Class<String>明确表示您的意思是String class。原始Class可能表示两者

最后,它对编译器没有太大影响,但在使代码的意图更易于理解和维护方面却有很大的不同。

Class java文档:

类型参数: T - Class object 建模的Class的类型。例如String.class的类型是Class<String> 如果正在建模的 class 未知,请使用Class<?>

在没有类型参数的情况下使用Class类似于在没有类型参数的情况下使用任何泛型 class( MapList等)——它要么是 1.5 之前的遗留用法,要么只是一段不关心未经检查的类型转换的代码.

Class <?>表明您有意编写 Java 5 级代码,这些代码不知道或不关心您正在处理的 class 是什么。 遗漏使它看起来像旧代码或由尚未学习 generics 的人编写的代码。

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

例如:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM