我正在尝试创建一个泛型类型,该类型保存已创建的自身版本的映射,以供以后使用。实际上,它是一个单例模式,其中每个类型都有一个实例。到目前为止,我拥有的代码是:
public class FieldBinder<T> {
static final Map<Class<? extends Object>,FieldBinder<? extends Object>> instanceMap =
new HashMap<Class<? extends Object>,FieldBinder<? extends Object>>();
private FieldBinder() {}
synchronized public static <V extends Object> FieldBinder<V> getInstance(Class<V> klass) {
if(!instanceMap.containsKey(klass)) {
instanceMap.put(klass, new FieldBinder<V>());
}
return (FieldBinder<V>)instanceMap.get(klass);
}
}然而,我仍然不确定我是不是“做对了”。我觉得我应该能够指定这个集合是(类-> FieldBinder)。IDE对return语句发出警告的事实只会强化这一想法。
有没有更好的方法来处理这件事?
注意:This question看起来关系非常密切,但距离太远了,以至于我不知道如何将其中的信息应用到我自己的问题中。
发布于 2010-02-06 22:24:29
RHSeeger我明白你原来的问题了我找不到解决这个问题的办法。您可以尝试使用的是一个MyMap类,它可以根据您的请求进行绑定。然而,使用此映射会出现两个问题:
MyMap<?>,所以不能向其添加具有给定类型的内容。这是虚构的,我建议你参考Java Generics FAQs (参见案例研究3)了解更多细节。<?>表示不同的类型),因为这两个类型可能没有连接。在玩的时候,我看到了一些错误,我自己也无法解释。我认为,每一件事都涉及到一个事实(正如我之前提到的),我们试图处理第二级参数化。
class FieldBinder<T> {
static class MyMap<M> extends HashMap<Class<M>, FieldBinder<M>> {
}
static final MyMap<?> instanceMap1 = new MyMap<Object>();
static final Map<Class<?>, FieldBinder<?>> instanceMap2 = new HashMap<Class<?>, FieldBinder<?>>();
public static <V> void test() {
Class<V> c1 = null;
FieldBinder<V> f1 = null;
Class<?> c2 = null;
FieldBinder<?> f2 = null;
instanceMap1.put(c1, f1); // error (see 1)
instanceMap1.put(c2, f2); // error (see 2)
instanceMap2.put(c1, f1); // ok
instanceMap2.put(c2, f2); // ok
instanceMap2.put(c1, f2); // wish to be an error, but ok
instanceMap2.put(c2, f1); // wish to be an error, but ok
}
}https://stackoverflow.com/questions/2208317
复制相似问题