in C#, we can define a generic class A where T : new(). In this code, we can create an instance of T with new T(). How does this implement in Java? I read some article which says it's impossible.
The reason that I used have a singleton patten using generic in C# like:
public static class Singleton 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();
}
}
And way to make this method more graceful?
解决方案
No you can't do new T(), since you don't know if T has a no arg constructor, and because the type of T is not present at runtime due to type erasure.
To create an instance of T, you need to have code like,
public T create(Class 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);
}