使用 Function<T, ? extends Number>> 将 Integer 传递给泛型方法时出现编译错误

Compilation error when passing Integer into generic method with Function<T, ? extends Number>>

我有一些代码有 3 个覆盖方法,它们在输入上执行相同的操作(每个方法的代码都相同),它们之间的唯一区别是输入参数类型

private List<String> extractDoubleValues(Function<MyClass, List<Double>> extractions)
private List<String> extractLongValues(Function<MyClass List<Long>> extractions)
private List<String> extractIntegerValues(Function<MyClass, List<Integer>> extractions)

我试图用一个使我们使用通用通配符的方法来替换这 3 个方法,如下所示

private List<String> extractNumberValues(Function<MyClass, List<? extends Number>> extractions)

当我尝试使用上述通用方法代替 3 种类型特定方法之一时

Function<MyClass, List<Integer>> intExtractions; 
List<String> extractedValues = extractNumberValues(intExtractions);

我在上面的第二行代码中得到以下编译错误

Error:(59, 80) java: incompatible types: java.util.function.Function<MyClass,java.util.List<java.lang.Double>> cannot be converted to java.util.function.Function<MyClass,java.util.List<? extends java.lang.Number>>

我之前已经成功地用通配符替换了重复的方法,如下所示

List<String> convertNumberListToStringList(List<Integer> numberList)
List<String> convertNumberListToStringList(List<Double> numberList)

List<String> convertNumberListToStringList(List<? extends Number> numberList)

我是泛型概念的新手,所以我很好奇为什么上面的代码无法编译?不太明白为什么会编译失败

当您将 Function<MyClass, List<Number>> 的实例声明为 Function<MyClass, List<Integer>> 时,您限制了要添加到 List 的其他类型的数字,即 LongDouble 无法添加到 List<Integer>。因此不兼容的类型错误。

主要问题(或者我应该说功能?)这里是通用的,仅在编译期间使用。在运行时,您没有任何关于泛型的信息。换句话说,您必须考虑 List<Integer>List<Double> 以及完全不同的类型。如果您在 Fucntion class 中看到,您将看到 <T, R> 没有通配符。因此,即使 Function 也使用 List<Integer>List<Double> 作为完全不同的类型。如果你想对 Function 说 R 将是 List 类型的东西,你必须这样编码:

Function<SomeClass, ? extends List<? extends SomeOtherClass>>

通过上面的代码,您可以确定 R 将是 List,并且 list 将包含 SomeOtherClass 的实例。

使用泛型的要点是泛型将原始 class 更改为其他 class...