将Integer传递给泛函方法时出现编译错误,函数<t,?=“”extends =“”number =“”>&gt;

时间:2017-12-07 10:55:41

标签: java generics nested-generics

我有一些代码有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)

我对泛型的想法很陌生,所以我很好奇为什么上面的内容会无法编译?我不太明白为什么它不能编译

2 个答案:

答案 0 :(得分:1)

当您将Function<MyClass, List<Number>>的实例声明为Function<MyClass, List<Integer>>时,您将其他类型的数字限制为List,即LongDouble可以& #39; t被添加到List<Integer>。因此,不兼容的类型错误。

答案 1 :(得分:1)

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

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

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

使用generic时的主要观点是泛型将原始类更改为其他类......