在Java中创建T的新实例

时间:2011-04-19 01:10:49

标签: c# java generics design-patterns

在C#中,我们可以定义通用class A<T> where T : new()。在此代码中,我们可以使用T创建new 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();
    }
}

如何让这种方法更优雅?

3 个答案:

答案 0 :(得分:7)

不,你不能做新的T(),因为你不知道T是否有一个没有arg的构造函数,并且由于type erasure而在运行时不存在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);
}

答案 1 :(得分:1)

是的,new T()是不可能的,因为泛型是Java中的编译时功能。在运行期间,通用信息丢失;因此,您将无法执行new T(),因为JVM在运行时不知道T是什么。

使用Java提到的确切语法可能会运气不好。

答案 2 :(得分:0)

谢谢大家,我们不能在JAVA中使用它。作为Sbridges的方式,在C#中,我们可以这样实现:

static T Create(Type type)
{
    return (T)Activator.CreateInstance(type);
}

甚至更容易:

static T Create()
{
    return Activator.CreateInstance<T>();
}

告诉你。