4

我想实现这样的地图,

Map<Class<T>, T> m;

其中,给定 T 的类,我可以得到一个 T 类型的通用对象。

我知道你可能会说,你可以包装 aMap<String, Object>并使用强制转换来归档它。

我知道这个。

但是想象一下地图是Map<Class<T>, Collection<T>>,其中,值是一个非常大的集合。

我不想遍历集合并转换每个对象,因为集合太大了。

所以?我该怎么办?

4

3 回答 3

4

Guava也有类似的东西,它叫做ClassToInstanceMap

您可以在专门的 Wiki 部分中阅读有关它的更多信息。

但显然你需要的是一个ClassToInstanceMultimap. 目前还没有,但您可以提交功能请求。

于 2012-11-14T09:07:59.413 回答
1

我不想遍历集合并转换每个对象,因为集合太大了。

我不会担心,因为

  • 你永远不需要这样做
  • 泛型是编译时检查,因此转换为泛型在运行时不会做任何事情。

例如 If T extends Object,强制转换 aObject不会T做任何事情。类似地 cast CollectiontoCollection<T>在运行时不做任何事情。

但是想象一下map是Map<Class<T>,Collection<T>>,其中,值是一个非常大的集合。

如果您认为这会有所作为,那么强制转换不是答案。您可能需要转换 Collection 的内容,但这在 Java 中完全不同。

于 2012-11-14T09:12:21.877 回答
0

请注意,由于 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 年后,我最终在清理阶段再次从我的代码中删除了它们。他们是个黑客,并没有像我预期的那样给我带来很多好处。

于 2012-11-14T09:18:23.390 回答