【发布时间】:2015-02-12 07:07:59
【问题描述】:
我很难使用泛型声明地图。我想声明一个具有以下属性的地图:
- 键是从特定接口 (IFoo) 派生的任何类型 T 的 Class 对象
- Map的值是另一个Map,它的key是String,值是T型
我以为我可以这样做:
public static Map<Class<T extends IFoo>, Map<String, T>> valueCache =
new HashMap<Class<T extends IFoo>, Map<String, T>>();
“扩展”出现语法错误
如果我像这样用通配符 (?) 替换 T 类型,它似乎在语法上是正确的:
public static Map<Class<? extends Typ>, Map<Integer, ?>> valueCache=
new HashMap<Class<? extends Typ>, Map<Integer, ?>>();
但我不认为这是我想要的,因为我想成为 Class 对象的类型,成为第二个映射中的值。
任何帮助表示赞赏。
【问题讨论】:
-
嗯。这是一个静态字段。它只有一个副本。这种类型不应该已经知道了吗?为什么需要占位符?没有实例,怎么会有泛型?
-
我认为没有任何方法可以在泛型类之外进行这样的声明。但是如果该字段不是公共的,您至少可以使用通用方法来访问它并确保类型匹配。公共静态变量是魔鬼。
-
你不能真的这样做:你不能让
Class类型与值相对应。 -
您的
T必须在某处声明。在哪里? -
@JBNizet:关于公众,你是对的,这是我的例子中的一个失误......感谢静态方法的提示
标签: java generics collections