Class和Class<?>声明有什么区别?
Class
Class<?>
Class a;
Class<?> b;
atmip9wb1#
这与所有泛型和原始类型相同:
Class // An unknown class (raw type) Class<?> // An unknown class (generic version) Class<String> // The String class
在这种特殊情况下,Class和Class<?>之间没有太大的实际区别,因为它们都表示一个未知的类。根据现有的声明,编译器可以要求泛型类型而不是原始类型。
**但是:**从Java 1.5开始,你应该尽可能使用泛型形式。Class<?>清楚地表明你指的是“一个未知的类”,Class<String>清楚地表明你指的是String类。原始的Class可能意味着 * 两者 *。
Class<String>
String
最后,它对编译器没有太大的影响,但它在使代码的意图更易于理解和维护方面有很大的不同。
bhmjp9jg2#
javadoc类:
类型参数:T-该Class对象所建模的类的类型,例如String.class的类型为Class<String>,如果建模的类未知,则使用Class<?>。
T
String.class
使用不带类型参数的Class类似于使用任何不带类型参数的泛型类(Map,List等)-这可能是1.5之前的遗留用法,也可能只是一段不关心未检查类型转换的代码。
Map
List
eqoofvh93#
类<?>表明你在故意编写Java 5级代码,而不知道或不关心你正在处理的是什么类。省略使它看起来像旧代码或由尚未学习泛型的人编写的代码。
<?>
yuvru6vn4#
“它看起来像旧代码或由尚未学习泛型的人编写的代码。”这是一个正确的陈述。Class(发音为“class of unknown”),即类型匹配任何内容的类。它被称为通配符类型是出于显而易见的原因。例如:
public void drawAll(List<Shape> shapes) { for (Shape s: shapes) { s.draw(this); } }
类型规则说drawAll()只能在Shape的列表上调用:例如,它不能在List<Circle>上被调用。这是不幸的,因为所有的方法都是从列表中读取形状,所以它也可以在List<Circle>上被调用。我们真正想要的是方法接受任何类型的形状列表。
Shape
List<Circle>
public void drawAll (List <? extends Shape> shapes) { }
阅读更多:http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html
4条答案
按热度按时间atmip9wb1#
这与所有泛型和原始类型相同:
在这种特殊情况下,
Class
和Class<?>
之间没有太大的实际区别,因为它们都表示一个未知的类。根据现有的声明,编译器可以要求泛型类型而不是原始类型。**但是:**从Java 1.5开始,你应该尽可能使用泛型形式。
Class<?>
清楚地表明你指的是“一个未知的类”,Class<String>
清楚地表明你指的是String
类。原始的Class
可能意味着 * 两者 *。最后,它对编译器没有太大的影响,但它在使代码的意图更易于理解和维护方面有很大的不同。
bhmjp9jg2#
javadoc类:
类型参数:
T
-该Class
对象所建模的类的类型,例如String.class
的类型为Class<String>
,如果建模的类未知,则使用Class<?>
。使用不带类型参数的
Class
类似于使用任何不带类型参数的泛型类(Map
,List
等)-这可能是1.5之前的遗留用法,也可能只是一段不关心未检查类型转换的代码。eqoofvh93#
类
<?>
表明你在故意编写Java 5级代码,而不知道或不关心你正在处理的是什么类。省略使它看起来像旧代码或由尚未学习泛型的人编写的代码。yuvru6vn4#
“它看起来像旧代码或由尚未学习泛型的人编写的代码。”这是一个正确的陈述。Class(发音为“class of unknown”),即类型匹配任何内容的类。它被称为通配符类型是出于显而易见的原因。
例如:
类型规则说drawAll()只能在
Shape
的列表上调用:例如,它不能在List<Circle>
上被调用。这是不幸的,因为所有的方法都是从列表中读取形状,所以它也可以在List<Circle>
上被调用。我们真正想要的是方法接受任何类型的形状列表。
阅读更多:http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html