我想实现这样的地图,
Map<Class<T>, T> m;
其中,给定 T 的类,我可以得到一个 T 类型的通用对象。
我知道你可能会说,你可以包装 aMap<String, Object>
并使用强制转换来归档它。
我知道这个。
但是想象一下地图是Map<Class<T>, Collection<T>>
,其中,值是一个非常大的集合。
我不想遍历集合并转换每个对象,因为集合太大了。
所以?我该怎么办?
Guava也有类似的东西,它叫做ClassToInstanceMap。
您可以在专门的 Wiki 部分中阅读有关它的更多信息。
但显然你需要的是一个ClassToInstanceMultimap
. 目前还没有,但您可以提交功能请求。
我不想遍历集合并转换每个对象,因为集合太大了。
我不会担心,因为
例如 If T extends Object
,强制转换 aObject
不会T
做任何事情。类似地 cast Collection
toCollection<T>
在运行时不做任何事情。
但是想象一下map是Map<Class<T>,Collection<T>>,其中,值是一个非常大的集合。
如果您认为这会有所作为,那么强制转换不是答案。您可能需要转换 Collection 的内容,但这在 Java 中完全不同。
请注意,由于 Java 使用类型擦除,因此实现实际上将具有
Map<?, ?> = Map<Object, Object>
您可以轻松编写一个安全的访问器方法,为您提供所需的类型安全性,例如进行instanceOf
检查:
public class InstanceMap extends HashMap<Class<?>, Object> {
public <T> T getInstance(Class<T> cls) {
Object o = super.get(cls);
if (o != null && cls.isInstance(o)) {
return (T) o;
} else {
return null;
}
}
public <T> void putInstance(Class<T> cls, T value) {
super.put(cls, value);
}
@Deprecated
public Object get(Object key) {
return super.get(key);
}
}
除非您开始使用本身是通用的类型,否则这将正常工作。Class<? super T>
然后会有所帮助。但总的来说,它主要给你一种类型安全的错误感觉。这种映射不会为您提供您习惯的强类型安全性。最后,它只不过是一个演员表。
我以前使用过这样的地图,但在使用了 1-2 年后,我最终在清理阶段再次从我的代码中删除了它们。他们是个黑客,并没有像我预期的那样给我带来很多好处。