[英]Create new instance of T in Java
在C#中,我們可以定義一個泛型class A<T> where T : new()
。 在這段代碼中,我們可以用new T()
創建一個T
實例。 這是如何在Java中實現的? 我讀了一些文章說這是不可能的。
我使用的原因是在C#中使用泛型的單例模式:
public static class Singleton<T> where T : new()
{
private static T instance;
public static T Instance
{
get
{
if (instance == null)
{
instance = SingletonCreater.Instance;
}
return instance;
}
}
static class SingletonCreater
{
internal static readonly T Instance = new T();
}
}
並且方法使這種方法更優雅?
不,你不能做新的T(),因為你不知道T是否有一個沒有arg構造函數,並且因為類型擦除而在運行時不存在T的類型 。
要創建T的實例,您需要有類似的代碼,
public <T> T create(Class<T> clazz) {
try {
//T must have a no arg constructor for this to work
return clazz.newInstance();
} catch (InstantiationException e) {
throw new IllegalStateException(e);
} catch (IllegalAccessException e) {
throw new IllegalStateException(e);
}
是的, new T()
是不可能的,因為泛型是Java中的編譯時功能。 在運行期間,通用信息丟失; 因此,您將無法執行new T()
因為JVM在運行時不知道T
是什么。
您可能會因為使用Java提到的確切語法而運氣不好。
謝謝大家,我們不能在JAVA中使用它。 作為Sbridges的方式,在C#中,我們可以這樣實現:
static T Create(Type type)
{
return (T)Activator.CreateInstance(type);
}
甚至更容易:
static T Create()
{
return Activator.CreateInstance<T>();
}
只是讓你知道。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.