Java中的泛型单例
为什么下面的代码抛出java.lang.InstantiationException:generics.SingletonFoo$AJava中的泛型单例,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; } 私人甲级{
公共类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更改为makeA
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() {
}
}