当前位置: 首页 > 面试题库 >

Java映射,其值受键的type参数限制

吕成业
2023-03-14
问题内容

在Java中,有没有一种方法可以将值的类型参数与键的类型参数绑定在一起?我要写的是如下内容:

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

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

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

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

编辑:感谢克莱特斯的回答。我实际上不需要映射本身上的类型参数,因为我可以确保获取/设置值的方法的一致性,即使这意味着使用一些稍微难看的强制转换也是如此。


问题答案:

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

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

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

  public <T> T getFavorite(Class<T> 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);
  }
}


 类似资料:
  • 假设我们有一个键-值映射的数据结构,其中键本身也是一个键-值映射。例如: 现在,假设我们要查询此映射中与键的某个键值子集匹配的所有顶级键/值。示例: 我们的查询是“给我所有key值,其中key包含,它将返回第一个和第三个值将返回所有同时具有和的键值,生成第二个值。显然,我们可以在每一个查询的完整地图中进行搜索,但我正在寻找比这更高效的方法。 我四处查看了一下,但是找不到一个高效、易用的C解决方案。

  • 问题内容: 我认为我的问题与此相似:如何实现具有多个键的Map?但有一个重要的区别。在这个问题中(如果我对它的理解是正确的,请告诉我是否正确),这些键应该总是唯一的。我想要一个Map形式: MyMap ,其中的键不一定是唯一的。如果那没有任何意义,我基本上想要一个二维数组,而不是通过坐标对引用元素,而是通过对象对引用它们。 是否有人对可以在其中工作的图书馆或自己实现此想法的好方法有任何想法?就库而

  • 问题内容: 我有一个以整数为键的地图。使用EL,如何通过其键访问值? 我以为这可以工作,但是不行(请求的属性中已经有map了): 跟进:我找到了问题所在。显然使用数字作为进行地图查找Long。当我更改为并收到错误时,我发现了这一点: 如果我将地图更改为: 然后返回“一个”。那是什么 为什么将数字视为长号。对我来说似乎违反直觉(因为int比long更常用)。 所以我的新问题是,是否有一个EL表示法可

  • 问题内容: 我不确定我想做什么,但是如果可以,我想知道如何做。基本上,我想创建一个Map,其中键是一个类(),并且该条目的值是该类的实例。目前我有 但是,这意味着任何对象都可以放置在地图中。如果可能的话,我想这样做,因此只能将键中的类的实例放置在地图中。有什么方法可以使用?在类上确保参数化? 另外,我发现这样做可能会导致内存泄漏。我不确定我是否完全理解这种情况。我只会将单例对象粘贴到映射中,因此是

  • 我想在NIFI中使用Jolt处理器实现以下JSON转换 是否有一种方法可以使用现有的Jolt操作来实现这一点,或者我需要编写自定义操作? 谢了。

  • 这里有一个映射,我正在尝试检查数组中的值,如果它找到,则返回;如果它没有找到,则返回预期输出。根据我对和索引的了解,如果(x[index]===y[j]){condition=true}应该进入