2014-10-29 75 views
1

我想用一個類型參數構造一個泛型類的實例。例如,如果有ArrayList.class並且我想用String.class類對它進行初始化,那麼我該怎麼做?我知道我可以使用ArrayList.class.newInstance()來創建一個新的實例,但我無法傳入一個類型參數。我想要做new ArrayList<String>,但不是那個具體的例子,而是任何具有類型參數的類。Java構造通用實例來自類

具體來說,我想通過子類化JUnit測試來嘗試implement testing of different implementations of an interface

+0

[Java中實例化通用類]的可能重複(http://stackoverflow.com/questions/1090458/instantiating-a-generic-class-in-java) – 2014-10-29 03:21:57

+0

基本上,你不能因爲[類型擦除](http://docs.oracle.com/javase/tutorial/java/generics/erasure.html)。 – 2014-10-29 03:23:32

+1

@RobbyCornelissen我不認爲這是。那是在如何初始化泛型類中的類型。我在問如何初始化一個類型的泛型類。 – 2014-10-29 03:23:38

回答

0

我意識到,只需返回泛型類的初始化,不需要類型參數,只需將其轉換爲該參數。

例如:

private Class<? extends List> implementation = ArrayList.class; 

private <E> List<E> newList(Class<E> itemClass) { 
    try { 
     return (List)implementation.newInstance(); 
    } catch (Throwable x) { 
     return null; 
    } 
} 

@Test 
public void test1() { 
    List<String> testInstance = newList(String.class); 
    testInstance.add('hey'); 
    assertEquals(3, testInstance.get(0).lenght()); 
} 
+0

你不應該捕獲Throwable。否則,是的,你可以這樣做。我會親自轉入'(列表)',並使用一個臨時變量用'@SuppressWarnings(「unchecked」)'註釋賦值。 – Radiodef 2014-10-29 03:49:04

+0

不過,關於未經檢查的轉換,您會收到此警告。 – Thilo 2014-10-29 03:49:06

+0

@Thilo只要你沒有在列表中加入某些東西,它就很安全。 – Radiodef 2014-10-29 03:52:21