当我们将一个类作为参数而不是它的实例传递时,我感到很困惑。 例如:
myMethod(classA.class);
你能举例说明我们何时以及如何将一个类作为参数传递?
答案 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;
答案 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
表明你是一个人,我是一个动物:)