使用 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
的其他类型的数字,即 Long
和 Double
无法添加到 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...
我有一些代码有 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
的其他类型的数字,即 Long
和 Double
无法添加到 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...