我正在尝试使用泛型和继承来实现Lazy Singleton。我已经创建了一个abstract超类,并声明了一个映射,它将存储这个类的子类的所有实例。
这就是它:
public abstract class AbstractXMLParser<T> {
@SuppressWarnings("rawtypes")
private static final Map<Class<? extends AbstractXMLParser>, AbstractXMLParser> INSTANCES = new HashMap<>();
public AbstractXMLParser() {
throw new UnsupportedOperationException("Cannot instantiate");
}
private static class SingletonHolder<T> {
@SuppressWarnings({ "unchecked"})
private static <T> T getInstance() throws InstantiationException, IllegalAccessException {
Class<T> clazz = (Class<T>) ((ParameterizedType) SingletonHolder.class.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
return clazz.newInstance();
}
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public static <T extends AbstractXMLParser> T getInstance() throws InstantiationException, IllegalAccessException {
Class<T> clazz = (Class<T>) ((ParameterizedType) AbstractXMLParser.class.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
if(INSTANCES.containsKey(clazz)) {
return (T) INSTANCES.get(clazz);
} else {
T instance = SingletonHolder.getInstance();
INSTANCES.put(clazz, instance);
return instance;
}
}
}其中一个子类是:
public class ActivityTypeXMLParser extends AbstractXMLParser<ActivityTypeXMLParser>{
private ActivityTypesXMLModel activityTypes;
private ActivityTypeXMLParser() {
}
public static void main(String... strings) throws InstantiationException, IllegalAccessException {
ActivityTypeXMLParser.getInstance();
}
}main方法用于测试目的。但是我得到了一个例外:
Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
at com.edfx.adb.xml.parser.AbstractXMLParser.getInstance(AbstractXMLParser.java:25)
at com.edfx.adb.xml.parser.ActivityTypeXMLParser.main(ActivityTypeXMLParser.java:30)现在,经过调试,我发现
Class<T> clazz = (Class<T>) ((ParameterizedType) AbstractXMLParser.class.getClass().getGenericSuperclass()).getActualTypeArguments()[0];是异常的原因,因为AbstractXMLParser.class.getClass().getGenericSuperclass()返回class java.lang.Object。我需要把Class<T>放在这里。如何在AbstractXMLParser类和AbstractXMLParser的SingletonHolder中提取它
发布于 2013-01-06 17:19:25
此代码存在多个问题:
static方法不是继承的。AbstractXMLParser.getInstance()不知道当ActivityTypeXMLParser.getInstance().AbstractXMLParser.class.getClass()返回你的类的, not类时,它是在ActivityTypeXMLParser的上下文中被调用的。AbstractXMLParser<T>是泛型的。请注意,AbstractXMLParser、SingletonHolder和getInstance()中的T是不同的类型参数。您需要将有问题的类隐式传递给getInstance():
getInstance(ActivityTypeXMLParser.class);。
@SuppressWarnings({ "unchecked", "rawtypes" })
public static <T extends AbstractXMLParser> T getInstance(Class<T> clazz)
throws InstantiationException,
...
}https://stackoverflow.com/questions/14180619
复制相似问题