【发布时间】:2014-09-10 14:49:03
【问题描述】:
当我们应该将一个类作为参数而不是它的实例传递时,我很困惑。 例如:
myMethod(classA.class);
您能否举例说明我们应该何时以及如何将类作为参数传递?
【问题讨论】:
当我们应该将一个类作为参数而不是它的实例传递时,我很困惑。 例如:
myMethod(classA.class);
您能否举例说明我们应该何时以及如何将类作为参数传递?
【问题讨论】:
一个经典的例子是通过反射创建一个类的实例:
//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 中使用的那样。
【讨论】:
例如,如果你想将多个字段的值封装到一个实体中,比如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;
}
【讨论】:
假设我们有一些创造者
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;
【讨论】:
愚蠢的例子:
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
表明你是人,我是动物:)
【讨论】: