我什么时候应该通过一个类作为参数?

时间:2014-09-10 14:49:04

标签: java class

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

myMethod(classA.class);

你能举例说明我们何时以及如何将一个类作为参数传递?

4 个答案:

答案 0 :(得分:9)

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

//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中所使用的那样。

答案 1 :(得分:1)

让我们考虑一下我们有一些创作者

  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);

如果基类不了解儿童班,我们就无法做到这一点 而且,我们不会受到来自main.Creator到T&#34的未经检查的演员的不安。如果我们像那样投射那么我们就会发出警告

  return (T)this;

请参阅Java Class.cast() vs. cast operator

答案 2 :(得分:1)

例如,如果要封装许多字段&#39;值为一个实体,如Hibernate框架的方法&#34; session.get(Class entityClass,String primaryKey)&#34;你需要定义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 :(得分:0)

愚蠢的例子:

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

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