理解类<! - ? - >

时间:2014-02-14 12:59:30

标签: java android generics

我遇到了这段代码:

public class RestfulAdage extends Application {
  @Override
  public Set<Class<?>> getClasses() {
    Set<Class<?>> set = new HashSet<Class<?>>();
    set.add(Adages.class);
    return set;
  }
}

我不明白Class<?>的含义。

6 个答案:

答案 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;    
}