我的通用Map可以防止放置特定类的对象

时间:2018-01-15 06:04:22

标签: java generics

我目前有班级球和球。为了防止有两个函数,我决定使用一个泛型函数,该函数应返回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)

我的意思是我的代码出了什么问题?

1 个答案:

答案 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()作为参数,然后直接将其添加到地图中。