2016-09-18 26 views
-2

我有一個類型的參數化方法,但我不能叫的類型參數化參數getClass因爲它可以null,所以我看到的唯一的解決辦法是從類型參數本身得到Class,不知何故:如何從方法的類型參數獲取一個Class對象?

public <T> Class myMethod(T obj) 
{ 
    //can't do this: return obj.getClass() because null is permitted. 
} 

此方法只是說明問題。我的實際方法甚至不會返回參數的類,但以不同的方式使用它。問題的核心是這樣的:有沒有辦法讓Class對象代表我的方法參數的參數化類型,而不使用obj.getClass()(因爲如果obj是null,我仍然需要知道方法的參數類型是什麼調用,例如:<String>myMethod(null)必須返回java.lang.String類對象)。

編輯這不是上述問題的重複,因爲我的類沒有參數化,只有我的方法。

+1

你不能,期間。這是什麼意圖告訴你,'getClass()'不會? – chrylis

+0

@chrylis該方法是一個例子。我的實際方法不是那樣的。我只是將問題簡化爲核心:我需要知道可能爲null的對象的類。 – FinnTheHuman

+0

[如何獲得泛型類型T的類實例]可能的副本(http://stackoverflow.com/questions/3437897/how-to-get-a-class-instance-of-generics-type-t) – fabian

回答

2

問題的核心是:有沒有辦法讓Class對象,它表示參數化類型我的方法的參數[...]

Class號不包含任何有關類型參數值的信息。 Class只包含有關類的定義的數據,但不包含有關類型的用法的數據。事實上,由於類型擦除,您無法獲得有關類型參數的這類信息(請參見https://docs.oracle.com/javase/tutorial/java/generics/genMethods.html(methods)和https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html(types))。

+0

我現在看到。編譯器根本沒有保留任何信息。謝謝,這回答我的問題 – FinnTheHuman

0

的解決方案是重構方法:

public <T> Class<T> myMethod(Class<T> theClass, T obj) 
    // other stuffs 
    return theClass; 
} 

但主叫方已經知道T是,所以真正的問題是,你爲什麼需要這一點。

=>社區wiki

+0

這是我試圖避免的方法。我將我的方法重構爲'Class myMethod(Class cls,Object obj)' – FinnTheHuman

+0

參數'obj'在這裏是沒用的,因爲它從來沒有使用過。這個方法通常也很沒用,因爲它只是返回一個參數,所以爲什麼不直接使用傳入的參數而不是調用方法呢? – newacct

+0

@newacct「其他東西」 – 2016-09-21 05:33:22

相關問題