在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();
}
}
如何让这种方法更优雅?
答案 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>();
}
告诉你。