簡體   English   中英

在Java中創建T的新實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM