gpt4 book ai didi

Multimap 中的 Java 泛型删除

转载 作者:搜寻专家 更新时间:2023-11-01 01:00:50 24 4
gpt4 key购买 nike

我有两个 Multimap 由 (i) Integer 和 (ii) Double 索引的 String >s 和一个输出 String 列表的例程。

public static void outputInteger(Multimap<Integer, String> map) {
for (Integer key : map.keySet()) {
Collection<String> strings = map.get(key);
output(strings);
}
}

public static void outputDouble(Multimap<Double, String> map) {
for (Double key : map.keySet()) {
Collection<String> strings = map.get(key);
output(strings);
}
}

我想使用 Number 作为 IntegerDouble 的父类(super class),将它们组合成一个例程

public static void outputNumber(Multimap<? extends Number, String> map) {
for (Number key : map.keySet()) {
Collection<String> ids = map.get(key); //**
}
}

但是带星号的那一行不编译

The method get(capture#5-of ? extends Number) in the type 
Multimap<capture#5-of ? extends Number,String> is not
applicable for the arguments (Number)

我该如何解决这个问题?

最佳答案

声明

Multimap<? extends Number, String> map;

表示 map 的键类型是未知但特定的 Number 子类型(包括)。换句话说,编译器认为它可能是 Multimap<Integer, String>。 , 或 Multimap<Short, String> , 或 Multimap<Number, String>等。因此,您不能调用 map.get(Number) ,因为据编译器所知,它可能是 Multimap<Double, String> .

无法做到这一点的原因在 put 中更为明显。 .如果你能做到 put(Number, String)map ?不,因为如果它恰好是 Multimap<Integer, String> ,然后您可以添加 Double这将破坏 map 的完整性。

与正常Map<K, V>接口(interface),这不是问题 get定义为 get(Object) , 不是 get(K) .

Paul 的回答对这种情况有很好的解决方法。本质上,他使用中间泛型方法为未知类型(在本例中由 capture#5-of ? extends Number 表示)命名(类型参数 T)。这允许您将发生在两个不同上下文中的捕获关联起来,以便您可以跨这些上下文执行某些操作。

关于Multimap 中的 Java 泛型删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16041990/

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