2013-07-30 81 views
1

假設我有:運行時泛型類型的Java

ClassA extends SuperClass{ ...} 
ClassB extends SuperClass{ ... } 

ClassX<T extends SuperClass> { ... }

現在,運行過程中我接觸過的物體,我知道應該是ClassA的或ClassB的之一。我想創建一個基於ClassX的實例。我怎樣才能做到這一點?

我曾嘗試:

Class<?> className = object.getClass(); 
Class<className> objectx = ... 

不工作。

在此先感謝!

+1

在比較過程中,所有的泛型將被Object替換。這就是爲什麼你不能在運行時選擇通用類型。 – pad

回答

0

ClassX<SuperClass> myObj = new ClassX<SuperClass>();

有了一個通用類,你剛纔說,你可以在那類是通用型

ClassX<T extends SuperClass>{ 
    public T value; // its just public so i dont need a setter 
} 

現在你可以做一個值: theObjectThatIsAOrB = xy.get( )//現在你得到你的Object,它是ClassA或ClassB

ClassX<SuperClass> myObj = new ClassX<SuperClass>(); 
myOjb.value = theObjectThatIsAOrB; 
0

這是不可能的,因爲它沒有任何意義。想一想,如果你能做到這一點,它會有什麼好處呢?類型參數的唯一目的是在編譯時進行類型檢查。所以如果你有一個你在編譯時不知道的類型參數,它不能輸入check,也不能做任何事情;因此,首先將類型參數放在首位是毫無意義的。 (使用通配符將沒有什麼不同。)

0

如果編譯器可以知道涉及哪個A或B,只需使用new。

public <T extends SuperClass> ClassX <T> makeClassXInstance(T aOrB) { 
    return new ClassX<T>(); 
} 

另一方面,如果您正在尋找在運行時確定類,類似這樣的東西可能會起作用。但是你遇到了變體類型問題。 Java很難解決它。

public <T extends SuperClass> ClassX <T> makeClassXInstance(T aOrB) { 
    return new ClassX<T>(aOrB.getClass()); 
} 

public class ClassX<T>{ 
    public ClassX(Class<T> cls) {...} 
}