gpt4 book ai didi

Java 泛型和 Map 声明

转载 作者:行者123 更新时间:2023-12-02 04:59:00 25 4
gpt4 key购买 nike

我很难使用泛型声明映射。我想声明一个具有以下属性的 Map:

  • key 是从特定接口(interface) (IFoo) 派生的任何类型 T 的类对象
  • Map 的值是另一个 Map,其键是 String,其值是类型 T

我想我可以这样做:

      public static Map<Class<T extends IFoo>, Map<String, T>> valueCache = 
new HashMap<Class<T extends IFoo>, Map<String, T>>();

我在“extends”上遇到语法错误

如果我用通配符 (?) 替换 T 类型,如下所示,它在语法上似乎是正确的:

    public static Map<Class<? extends Typ>, Map<Integer, ?>> valueCache= 
new HashMap<Class<? extends Typ>, Map<Integer, ?>>();

但我认为这不是我想要的,因为我希望 Class 对象的类型恰好成为第二个映射中的值。

感谢任何帮助。

最佳答案

泛型类型参数只能在类或方法声明上声明。

如果您不关心返回的 IFoo 的引用类型,您可以这样做

static Map<Class<? extends IFoo>, Map<String, IFoo>> fooMap;

如果您想使用返回的 IFoo 作为其子类类型,那么您需要进行一些转换。

// abbreviated example
class FooMap {
private static Map<Class<? extends IFoo>, Map<String, IFoo>> map = ...;

static void put(String key, IFoo foo) {
map.get(foo.getClass()).put(key, foo);
}

static <F extends IFoo> F get(Class<F> cls, String key) {
return cls.cast(map.get(cls).get(key));
}
}

FooMap.put("foo", new Foo());
Foo foo = FooMap.get(Foo.class, "foo");

关于Java 泛型和 Map 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28471350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com