我有一些代码有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)
我对泛型的想法很陌生,所以我很好奇为什么上面的内容会无法编译?我不太明白为什么它不能编译
答案 0 :(得分:1)
当您将Function<MyClass, List<Number>>
的实例声明为Function<MyClass, List<Integer>>
时,您将其他类型的数字限制为List
,即Long
和Double
可以& #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时的主要观点是泛型将原始类更改为其他类......