2011-06-30 204 views
2

具有聲明這個方法的類:獲取泛型類的類的類型?

public class A{ 
    public <T> T test(java.lang.Class<T> classOfT) 
} 

通常情況下它可以被稱爲針對的對象是這樣的:

A a = new A() 
String s = "test"; 
a.test(String.class); //I wrote this as s.class at first,which is wrong.Thanks Nick. 

現在我想概括傳遞給它的對象,所以我宣佈這樣的一個類:

public class B <T>{ 
    private A a = new A(); 
    private T obj = null; 
    T test(){return a.test(obj.getClass()); } 
} 

但代碼不'compile.I想知道是否有可能實現我的目標?

預先感謝您的Java大師;)

回答

3
T obj = ...; 
obj.getClass() 

最後一行返回Class<? extends T> - 但T是無界的,所以它基本上是由Object界,這意味着它返回Class<? extends Object>,這與Class<?>相同。與Class<?>類型的參數,它返回一個Object

T test() { return a.test(obj.getClass()); } 

將實際調用a.test,而不是T

所以這樣做。

只需將參數轉換爲Class<T>或返回類型爲T,它應該可行 - 儘管我還不明白爲什麼需要這樣的東西。此外,還有在原崗位這個奇怪的錯誤:

String s = "test"; 
a.test(s.class); 

"test".class是錯誤的 - 它應該是String.class

1

嘗試

@SuppressWarnings("unchecked") 
T test() { 
    return (T) a.test(obj.getClass()); 
} 
2
Class<T> clazz = (Class<T>) obj.getClass(); 
return a.test(clazz); 
0

在其他答案的補充,定義你的函數時,作爲

public class A{ 
    public <T> T test(java.lang.Class<T> classOfT) { ... } 
} 

,如果您使用的是classOfT參數只是確定T類型,你可能會更好,沒有參數的定義你的方法所有。例如,執行此操作而不是上述聲明:

public class A{ 
    public <T> T test() { ... } 
} 

這樣,您可以使用此限定的方法調用語法調用它。這是我怎麼會重寫代碼:

public class A{ 
    public <T> T test() { 
      // ... 
    }   

    public static void main(String[] args) { 
      A a = new A(); 
      String result = a.<String>test(); 
    } 
} 

public class B <T> { 
    private A a = new A(); 

    T test() { 
     return this.a.<T>test(); 
    } 
} 

這樣你就不需要通過通用A#test()函數的類參數,這可能已經在運行時使用。 當然,如果你在運行時使用classOfT,這個解決方案對你來說可能不是那麼有趣......