我目前有班级球和球。为了防止有两个函数,我决定使用一个泛型函数,该函数应返回Map<String, Bag>
或Map<String, Ball>
(取决于返回值)。
最初我宣布一张地图
Map<String, T> hits = new HashMap<String, T>();
Bag one_bag = new Bag();
hits.put("dsfsd", one_bag);
return hits;
然而,错误说:
put(String, T) in the type Map<String,T> is not applicable for the arguments (String, Bag)
我的意思是我的代码出了什么问题?
答案 0 :(得分:0)
应该返回Map或Map的泛型函数(取决于返回值)。
如果您希望地图中存在非空值,则根本不可能。除了通过传递的参数之外,该方法不知道如何调用它,因此无法知道是返回Bag
还是Ball
。
您的代码的问题是类型变量 - 但是它被声明 - 可以表示Bag
以外的类型。编译器无法知道它正好是Bag
(可能是Bag
或超类型,但它同样可以是子类型或不相关类型)。所以它不允许你这样做。
如果您一直想在地图中添加Bag
,则无需在此处使用泛型。只需将此方法设为非泛型,并返回Map<String, Bag>
。
如果您希望地图能够包含任何一个,您需要提供一个可用于约束结果的参数:传入能够创建相关实例的Supplier
:
<B> Map<String, B> yourMethod(Supplier<? extends B> supplier) {
Map<String, B> hits = new HashMap<>();
B thing = supplier.get();
hits.put("dsfsd", thing);
return hits;
}
并调用:
Map<String, Ball> ballMap = yourMethod(Ball::new);
或者更简单,只需传入new Ball()
或new Bag()
作为参数,然后直接将其添加到地图中。