为什么以下代码抛出 java.lang.InstantiationException:generics.SingletonFoo $ A ?
public class SingletonFoo {
private static Object _tn;
public static <T> T instance(Class<T> t) {
if (_tn != null) {
return (T) _tn;
}
try {
_tn = t.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return (T) _tn;
}
private class A{
public A() {
}
}
public static void main(String[] args) {
System.out.println(SingletonFoo.instance(A.class));
}
}
它是否与某种类型的擦除有关,并且不可能在Java中创建通用单例?
答案 0 :(得分:4)
这里A不是静态类。这意味着它包含对包含SingletonFoo(隐式)的引用,这意味着您可能无法通过newInstance实例化它。
尝试将其设置为静态,或者如果它不需要是内部类,则将其移出类。
解决方案1:使A成为静态成员类
private static class A{
public A() {
}
}
Soution 2:外出
public class SingletonFoo {
private static Object _tn;
public static <T> T instance(Class<T> t) {
if (_tn != null) {
return (T) _tn;
}
try {
_tn = t.newInstance();
;
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return (T) _tn;
}
public static void main(String[] args) {
System.out.println(SingletonFoo.instance(A.class));
}
}
class A {
public A() {
}
}