gpt4 book ai didi

java - 泛型和变量赋值的问题

转载 作者:行者123 更新时间:2023-11-30 08:43:16 26 4
gpt4 key购买 nike

我有两张 map Something1Something2 .都扩展类 Something .

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

我想创建一个更通用的 map m3我可以将 m1 分配给它或 m2像这样:

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

但是我得到以下异常:

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

我也试过使用 Class<?>但它似乎不起作用。

我做错了什么?

最佳答案

那是不可能的。请考虑以下事项:

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 类型 Map 的键。

关于java - 泛型和变量赋值的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34356004/

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