2016-06-14 34 views
0

爲什麼obj.getClass()返回類型爲<T>類型,當obj類型爲T時?這也產生了一個警告,我已經沉默了。但我覺得這不應該是必要的。這裏發生了什麼?Java泛型:爲什麼編譯器不能說明這個類<T>對象與這個類的類型參數的對象類有相同的類型?

public class DataSerialization<T> { 
    private T deserializedObject; 
    private Class<T> classObject; 
    private String serializedObject = null; 

    private static final Gson gson = new Gson(); 

    @SuppressWarnings("unchecked") 
    public DataSerialization(T obj) { 
     this.deserializedObject = obj; 
     this.classObject = (Class<T>) obj.getClass(); 
    } 

    // ... 
} 
+0

是什麼讓你認爲'deserializedObject'不能是'T'的子類而不是'T'? –

+0

@LouisWasserman:它不返回'類' – newacct

+0

如果你有一個實際的非泛型對象,它將返回一個'Class <?擴展Foo>'。我不認爲它適用於仿製藥。 –

回答

-1

簡單地說,這是因爲getClass方法返回Class<?>,不管是什麼類型的類的對象實際上是。儘管類型Class<?>的引用在這種情況下指向Class<T>類型的對象,但方法簽名將返回類型定義爲Class<?>,這是編譯器期望的結果。

的編譯器,你是鑄造Class<?>Class<T>,這標誌一個警告,因爲沒有辦法保證,單獨返回類型,即是這種情況。

+0

謝謝,這解釋了它。這是否合理,因爲它永遠是正確的?我不喜歡禁止警告,因爲它通常意味着我做錯了什麼,但我不能想到這種情況不正確。 – boshea

+0

我認爲這是合理的,但我建議你看看這個答案,關於如何避免使用「T.class」類對象的想法。 http://stackoverflow.com/a/3437930/4793951 – Zircon

+1

@boshea是什麼讓你覺得它會「永遠是正確的」?你爲什麼不認爲'deserializedObject'可能是'T'的子類? –

相關問題