Java中的泛型单例

Java中的泛型单例,java,generics,singleton,Java,Generics,Singleton,为什么下面的代码抛出java.lang.InstantiationException:generics.SingletonFoo$A 公共类SingletonFoo{ 私有静态对象_tn; 公共静态T实例(类T){ 如果(_tn!=null){ 返回(T)tn; } 试一试{ _tn=t.newInstance(); }捕获(实例化异常e){ e、 printStackTrace(); }捕获(非法访问例外e){ e、 printStackTrace(); } 返回(T)tn; } 私人甲级{

为什么下面的代码抛出java.lang.InstantiationException:generics.SingletonFoo$A

公共类SingletonFoo{
私有静态对象_tn;
公共静态T实例(类T){
如果(_tn!=null){
返回(T)tn;
}
试一试{
_tn=t.newInstance();
}捕获(实例化异常e){
e、 printStackTrace();
}捕获(非法访问例外e){
e、 printStackTrace();
}
返回(T)tn;
}
私人甲级{
公共A(){
}
}
公共静态void main(字符串[]args){
System.out.println(SingletonFoo.instance(A.class));
}
}

它是否与类型擦除有关,并且不可能在Java中创建泛型单例?

这里不是静态类。这意味着它包含对包含SingletonFoo的引用(隐式),这意味着您可能无法通过newInstance实例化它

尝试将其设置为静态,或者将其移出类,如果它不需要是内部类的话

解决方案1:创建一个静态成员类

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() {
    }
}
公共类SingletonFoo{
私有静态对象_tn;
公共静态T实例(类T){
如果(_tn!=null){
返回(T)tn;
}
试一试{
_tn=t.newInstance();
;
}捕获(实例化异常e){
e、 printStackTrace();
}捕获(非法访问例外e){
e、 printStackTrace();
}
返回(T)tn;
}
公共静态void main(字符串[]args){
System.out.println(SingletonFoo.instance(A.class));
}
}
甲级{
公共A(){
}
}

请包含完整的堆栈跟踪,而不仅仅是例外Singleton不是一个适合任何人使用的好模式。谷歌有一个工具可以在应用程序中识别它们,这样它们就可以被删除。也许你不应该在这上面下功夫。A类是内在的,所以它是打字错误,而不是内在的需要static@JekinKalariya请将make internal class static更改为make
A
A static嵌套class@JekinKalariya谢谢。虽然我认为解决方案1不太相关。因为目标是返回泛型参数的实例,而解决方案返回class.no.dear,它也将返回泛型参数的实例,因为我们在class.forname中传递类名
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() {
    }
}