【问题标题】:Understanding Class<?>理解类<?>
【发布时间】:2014-02-14 12:59:29
【问题描述】:

我遇到了这段代码:

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

我不明白Class&lt;?&gt; 是什么意思。

【问题讨论】:

标签: java android generics


【解决方案1】:

Class&lt;?&gt; 指的是一个未知类型的类。该符号使用unbounded generic,它对可以添加到集合的类的类型没有任何限制。例如以下将不起作用

Set<Class<String>> set = new HashSet<Class<String>>();
set.add(Adages.class); // type not allowed

【讨论】:

  • 但如果这是真的,那么为什么会失败:set.add("hello")
  • @user3134565 - "hello" 是字符串实例,而不是类实例。您可以放入集合String.class,但不能放入字符串实例。你也可以把"hello".getClass()
  • 好的,我现在明白了,但这有什么好处呢?我的意思是,我想不出一个很好的用途,你可以吗?
  • 你可以将任何类型放入Set,但它的类型没有被检查
  • 一个很好的例子是依赖容器,进行依赖注入en.wikipedia.org/wiki/Dependency_injection 通常在元编程时使用这种东西。
【解决方案2】:

Class 是一个可参数化的类,因此您可以使用语法 Class 其中 T 是一个类型。通过编写 Class,您声明了一个可以是任何类型的 Class 对象(? 是通配符)。 Class 类型是包含有关类的元信息的类型。

通过指定泛型类型来引用泛型类型总是一个好习惯,通过使用 Class 你尊重这种做法(你知道 Class 是可参数化的)但你没有限制你的参数有一个具体类型。

关于泛型和通配符的参考:http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

关于Class对象和反射的参考(Java语言用来自省的特性):http://java.sun.com/developer/technicalArticles/ALT/Reflection/

【讨论】:

    【解决方案3】:

    在通用代码中,称为通配符的问号 (?) 表示未知类型。通配符可用于多种情况:作为参数、字段或局部变量的类型;有时作为返回类型(尽管更具体的是更好的编程实践)。通配符永远不会用作泛型方法调用、泛型类实例创建或超类型的类型参数。

    以下部分将更详细地讨论通配符,包括上限通配符、下限通配符和通配符捕获。

    更多信息click here

    【讨论】:

    【解决方案4】:

    指的是gererics。我建议你读一点。基本上,您仅在运行时才知道要使用的对象类型。例如,Class 可以是 Integer、String 甚至是 YourDefinedClassType
    阅读这里http://java.sun.com/developer/technicalArticles/J2SE/generics/

    【讨论】:

    • 那么这是否意味着它可以接受任何类型的对象,例如字符串、整数、双精度...等?
    • set.add("dd") 失败,只取null...这是为什么呢
    • @user3134565 了解泛型,而不仅仅是人们告诉你的!你不能学会简单的方法。你尝试添加一个对象的实例,你需要一个类的实例
    【解决方案5】:

    发件人:Wildcards

    在通用代码中,称为通配符的问号 (?) 表示未知类型。通配符可用于多种情况:作为参数、字段或局部变量的类型;有时作为返回类型(尽管更具体的是更好的编程实践)。通配符永远不会用作泛型方法调用、泛型类实例创建或超类型的类型参数。

    查看链接,您会发现更详尽的文档、示例等。

    【讨论】:

      【解决方案6】:

      假设您有一组属于不同类型,并且您也有不同的实例。因此,如果您想检查这些实例是否是这些类中的 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;    
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-22
        • 2020-02-13
        • 2021-07-14
        • 2013-02-05
        相关资源
        最近更新 更多