當我們應該通過一個類作爲參數而不是實例時,我感到困惑。 例如:什麼時候應該通過一個類作爲參數?
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
使用。
讓我們考慮,我們有一些造物主
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」的警告,我們將如果我們投一樣,
return (T)this;
例如,如果你想將許多字段的值封裝到實體中,如Hibernate框架的方法「session.get(Class entityClass,String primaryKey)」。您需要定義entityClass,以便Hibernate知道如何將查詢結果封裝到實體中。 一個簡單的例子使用類作爲參數:
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;
}
傻例如:
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
說明你是一個人,我是一個動物:)