当前位置:  开发笔记 > 编程语言 > 正文

Java映射的值受键的类型参数限制

如何解决《Java映射的值受键的类型参数限制》经验,为你挑选了1个好方法。

在Java中是否有一种方法可以使用映射,其中值的类型参数与键的类型参数相关联?我想写的内容如下:

public class Foo {
    // This declaration won't compile - what should it be?
    private static Map, T> defaultValues;

    // These two methods are just fine
    public static  void setDefaultValue(Class clazz, T value) {
        defaultValues.put(clazz, value);
    }

    public static  T getDefaultValue(Class clazz) {
        return defaultValues.get(clazz);
    }
}

也就是说,只要值的类型与Class对象的类型匹配,我就可以对Class对象存储任何默认值.我不明白为什么不允许这样做,因为我可以确保在设置/获取类型正确的值时.

编辑:感谢cletus的回答.我实际上并不需要地图本身的类型参数,因为我可以确保获取/设置值的方法的一致性,即使它意味着使用一些稍微丑陋的演员表.



1> cletus..:

你不是试图实现Joshua Bloch的类型安全的异构容器模式吗?基本上:

public class Favorites {
  private Map, Object> favorites =
    new HashMap, Object>();

  public  void setFavorite(Class klass, T thing) {
    favorites.put(klass, thing);
  }

  public  T getFavorite(Class klass) {
    return klass.cast(favorites.get(klass));
  }

  public static void main(String[] args) {
    Favorites f = new Favorites();
    f.setFavorite(String.class, "Java");
    f.setFavorite(Integer.class, 0xcafebabe);
    String s = f.getFavorite(String.class);
    int i = f.getFavorite(Integer.class);
  }
}

来自Effective Java(第2版)和本演示文稿.


如果价值本身是通用怎么办?例如,不是存储`String`s和`int`s,而是需要存储`PrettyPrinter `,其中`T`是用作地图中键的类型标记?
@Lucas Guava为此提供了[`TypeToInstanceMap`](https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/reflect/TypeToInstanceMap.html); 与[`ClassToInstanceMap`](https://github.com/google/guava/wiki/NewCollectionTypesExplained#classtoinstancemap)一起复制Bloch的"Favorites"API.
推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有