2015-12-18 58 views
2

我有两个地图Something1Something2。两者都扩展类Something与泛型和变量赋值问题

Map<Class<? extends Something1>, String> m1 
Map<Class<? extends Something2> ,String> m2 

我想创建一个更通用的地图m3,而我可以分配m1m2这样的:

Map<Class<? extends Something>, String> m3 = m1; 

但是我得到以下异常:

Type mismatch: cannot convert from Map<Class<? extends Something1>, String> to Map<Class<? extends Something>, String> 

我也尝试使用Class<?>,但似乎没有工作。

我在做什么错?

+3

阅读本回答 - http://stackoverflow.com/a/19220458/1679863,了解多层次泛型如何工作。之后,您将能够理解将第三张地图更改为:Map <?扩展Class <?扩展Something>,String> = m1;'会工作。 –

+1

非常感谢!这解决了我的问题 – user1534960

回答

2

这是不可能的。考虑以下内容:

Map<Class<? extends Something1>, String> m1 = new HashMap<>(); 
m1.put(Something1.class, "Something1"); // OK 
m1.put(Something2.class, "Something2"); // Error 

所以,你不能把Something2作为关键。

其他各地的道:

Map<Class<? extends Something2>, String> m2 = new HashMap<>(); 
m2.put(Something1.class, "Something1"); // Error 
m2.put(Something2.class, "Something2"); // OK 

在这里,你不能把Something1的关键。

但是,如果您创建使用基类作为通配符的版本,它将起作用。看看这个:

Map<Class<? extends Something>, String> m = new HashMap<>(); 
m.put(Something1.class, "Something1"); // OK 
m.put(Something2.class, "Something2"); // OK 

你的问题是,然后你试图分配一个更具体的类型到泛型类型。像这样:

m = m1; // Boom, but why? 

为什么不行。嗯,这是因为如果你让你的分配将能够做到这一点:

m.put(Something2.class, "Something2"); 

这显然不会是好的,因为那么你会把Something2作为一个Something1型地图的关键。

0

非通配符类型参数必须完全相同才能兼容。 Class<? extends Something1>Class<? extends Something>(即使一个是另一个的子类型)并不完全相同,因此一个Map与另一个的Map不兼容。

如果你想有一个类型,它可以接受Map s的不同类型的参数,你需要在顶层一个通配符(但请注意,这将有效地使Map只读):

Map<? extends Class<? extends Something>, String> m3 = m1;