2010-05-09 96 views
3

Duplicate: Instantiating generics type in javaJava泛型 - 獲取型

嗨! 我是一個給Java嘗試的C#人..所以我如何在Java中做以下事情。

在C#

public T create_an_instance_of<T>(){ 
    T instance = default (T); 
// here's usually some factory to create the implementation 
    instance = some_factory.build<T>(); 
// or even.. 
    instance = some_factory.build(typeOf(T)); 

return instance; 
} 

回答

5

Java的泛型是基於type erasure。這允許它們向下兼容,但意味着你不能使用類型參數本身,因爲它在運行時不存在。

你可以做的最接近的事是這樣的:

public <T> T create_an_instance_of(Class<T> c){ 
    return c.newInstance(); // or use constructors via reflection 
} 
+0

備案,這將不會編譯,因爲例外;) – Bozho 2010-05-09 14:25:16

+0

和備案,downvote不是我的。好像所有的答案都被低估了。 – Bozho 2010-05-09 15:22:40

0

你不能這樣做,在Java的泛型,因爲都是非物化。你可以使用所謂的「類型標記」,但它有侷限性。

static <T> T construct(Class<T> klazz) { 
    try { 
     return klazz.newInstance(); 
    } catch (InstantiationException e) { 
     return null; 
    } catch (IllegalAccessException e) { 
     return null; 
    } 
} 

System.out.println(construct(String.class).isEmpty()); // prints "true" 

這使用Class<?>.newInstance()使用反射,其不總是成功(例如,當沒有公共null構造)來構造一個對象。

0

嘗試類似:

public static <T> T createInstance(Class<T> clazz) 
     throws IllegalArgumentException, SecurityException, 
     InstantiationException, IllegalAccessException, 
     InvocationTargetException, NoSuchMethodException { 
    T ans = clazz.getConstructor().newInstance(); 
    return ans; 
} 
0

正確的選擇是使用抽象工廠。只要將它傳入,它甚至可以創建沒有公共無參數構造函數或類接口類的適當實現類的實例。

反射是絕對不必要的,在這裏是錯誤的選擇。

+1

如果他想將其用於系統中的每種類型,抽象工廠將是不必要的開銷。 – Bozho 2010-05-09 15:26:33