我遇到了这段代码:
public class RestfulAdage extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> set = new HashSet<Class<?>>();
set.add(Adages.class);
return set;
}
}
我不明白Class<?>
的含义。
答案 0 :(得分:13)
Class<?>
指的是一类未知类型。符号使用unbounded generic,它对可添加到Collection的类的类型没有限制。例如,以下内容不起作用
Set<Class<String>> set = new HashSet<Class<String>>();
set.add(Adages.class); // type not allowed
答案 1 :(得分:7)
Class是一个可参数化的类,因此您可以使用语法Class,其中T是一个类型。通过编写Class,您将声明一个可以是任何类型的Class对象(?是通配符)。类类型是包含有关类的元信息的类型。
通过指定他的特定类型来引用泛型类型总是很好的做法,通过使用Class你尊重这种做法(你知道Class可以参数化)但是你并没有限制你的参数有一个特定类型。
关于泛型和通配符的参考:http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
关于类对象和反射的引用(用于内省自身的Java语言的特性):http://java.sun.com/developer/technicalArticles/ALT/Reflection/
答案 2 :(得分:7)
在通用代码中,称为通配符的问号(?)表示未知类型。通配符可用于各种情况:作为参数,字段或局部变量的类型;有时作为返回类型(虽然更好的编程实践更具体)。通配符从不用作泛型方法调用,泛型类实例创建或超类型的类型参数。
以下部分更详细地讨论通配符,包括上限有界通配符,下限有界通配符和通配符捕获。
了解更多信息click here
答案 3 :(得分:5)
它指的是gererics。我建议你读一点。基本上,您只知道在运行时使用哪种类型的对象。例如,Class可以是Integer,String甚至是YourDefinedClassType
在这里阅读http://java.sun.com/developer/technicalArticles/J2SE/generics/
答案 4 :(得分:5)
来自:Wildcards
在通用代码中,称为通配符的问号(?)表示未知类型。通配符可用于各种情况:作为参数,字段或局部变量的类型;有时作为返回类型(虽然更好的编程实践更具体)。通配符从不用作泛型方法调用,泛型类实例创建或超类型的类型参数。
检查链接,您将找到更详尽的文档,示例等。
答案 5 :(得分:4)
假设您有一组属于不同类型的类,并且您也有不同类的实例。因此,如果您想检查这些实例是否是 instanceof 这些类中的一个,您可以遍历这些集并完成工作。对于那种工作,你最好使用完全不受限制的套装:
public boolean checkClasses(Set<Class<?>> typeLessClassSet, Set instances){
while(typeLessClassSet.hasNext()){
Class c = typeLessClassSet.next();
while(instances.hasNext()){
Object o = instances.next();
if(o instanceof c)
return true;
}
}
return false;
}