【问题标题】:When should I pass a class as an argument?我什么时候应该传递一个类作为参数?
【发布时间】:2014-09-10 14:49:03
【问题描述】:

当我们应该将一个类作为参数而不是它的实例传递时,我很困惑。 例如:

myMethod(classA.class);

您能否举例说明我们应该何时以及如何将类作为参数传递?

【问题讨论】:

    标签: java class


    【解决方案1】:

    一个经典的例子是通过反射创建一个类的实例:

    //avoiding exception handling, leave that up to you
    static <T> T make(Class<T> clazz) {
        return clazz.newInstance();
    }
    //...
    A a = make(A.class);
    

    此外,当您想在编译时确保某些引用属于特定类时,如 Collections#checkedXxx 中使用的那样。

    【讨论】:

      【解决方案2】:

      例如,如果你想将多个字段的值封装到一个实体中,比如Hibernate框架的方法“session.get(Class entityClass,String primaryKey)”。你需要定义entityClass,以便Hibernate知道如何封装将查询结果转化为实体。 使用 Class 作为参数的简单示例:

       public T getInstance(Class<T extends Serializable> clazz) throws Exception
         {
                // the ParameterType "T extend Serializable" means that:
                // the argument clazz must be a sub of the Interface Serializable
                if(null != clazz)
                 {
                     return clazz.newInstacne();
                 }
      
               return null;
          }
      

      【讨论】:

        【解决方案3】:

        假设我们有一些创造者

          abstract class Creator<T>
          {
            Creator(Class<T> c)
            {
                this.c = c;
            }
        
            T addMainElement(Object obj)
            {
                return c.cast(this);
            }
        
            private Class<T> c;
          }
        

        还有一些包装器

           class CreatorWrapper extends Creator<CreatorWrapper>
           {
              CreatorWrapper() {
                super(CreatorWrapper.class);
              }
        
              CreatorWrapper addMinorElement(Object obj)
              {
                return this;
              }
           }
        

        这样做的主要优点是我们可以像那样使用我们的创建者

           CreatorWrapper creator = new CreatorWrapper()
                .addMainElement(someObj1)
                .addMinorElement(someObj2);
        

        如果基类不知道子类,我们将无法做到这一点。
        并且我们不会被“Unchecked cast from main.Creator to T”警告所困扰,如果我们像这样进行投射,我们将会受到干扰

          return (T)this;
        

        Java Class.cast() vs. cast operator

        【讨论】:

          【解决方案4】:

          愚蠢的例子:

          public class PassClassExample {
          
              public static class ClassValidator {
                  private Class theClass;
                  public ClassValidator(Class theClass) {
                      this.theClass = theClass;
                  }
          
                  public boolean instanceOf(Class someClass) {
                      return theClass == someClass;
                  }
              }
          
              public static void main (String [] args ) {
                  ClassValidator personValidator = new ClassValidator(Person.class);
          
                  Person you = new Person();
                  Animal me = new Animal();
          
                  System.out.println(personValidator.instanceOf(you.getClass()));
                  System.out.println(personValidator.instanceOf(me.getClass()));
          
              }
          
              public static class Person {
          
              }
          
              public static class Animal {
          
              }
          }
          

          会打印出来

          true
          false
          

          表明你是人,我是动物:)

          【讨论】:

            猜你喜欢
            • 2011-09-20
            • 2011-10-01
            • 2021-05-03
            • 2019-09-26
            • 1970-01-01
            • 2016-01-31
            • 2019-02-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多