2013-08-07 23 views
5

我正在檢查Bloch的Effective Java中的異構容器模式,我試圖確定爲什麼在向異構容器中插入對象時需要類引用。我不能使用instance.getClass()來獲取此參考嗎? JPA的entity manager是不是一個例子?將對象插入類型安全的異構容器時,爲什麼需要類引用?

interface BlochsHeterogeneousContainer { 

    <T> void put(Class<T> clazz, T instance); 

    <T> T get(Class<T> clazz); 
} 

interface AlternativeHeterogeneousContainer { 

    // Class<T> not needed because we can use instance.getClass() 
    <T> void put(T instance); 

    <T> T get(Class<T> clazz); 
} 

回答

5

不,你不能這樣做,因爲它不會給你的類引用類型的繼承的情況下,而在實際的類對象類型。

考慮這個例子:

Number num = new Integer(4); 
System.out.println(num.getClass()); 

會打印:

class java.lang.Integer 

,而不是java.lang.Number

+0

+1確切地說,接口允許'put(Number.class,num)'或'put(Integer.class,num)'適當。 –

+0

'put(Integer.class,num)'會拋出編譯器錯誤。這是有道理的,因爲參數的類型是(類,Number)。您不能將T設置爲整數,因爲Number不是整數。您不能將T設置爲編號,因爲類不是類。儘管如此,由於您可以執行諸如'put(Object.class,num)'之類的操作,因此擁有類型參數仍然很有用。在這種情況下,T被設置爲對象(並且所有數字都是對象,因此它可以工作)。 – Cod3Citrus

相關問題