【发布时间】:2018-11-16 03:51:34
【问题描述】:
有人可以帮我理解这段代码背后的逻辑吗:
import java.util.List;
import java.util.Arrays;
interface DoubleValue<T> {
public void dv(T e);
}
public class InTest2 {
public static void main(String[] a) {
DoubleValue<Number> func = e -> System.out.println(e.doubleValue());
List<Number> l = Arrays.asList(1, 2, 3);
InTest2.sumOfListNotWorking(l, func);
InTest2.sumOfListWorking(l, func);
InTest2.sumOfListWorkingSuper(l, func);
}
// I thought this should work
public static void sumOfListNotWorking(List<? extends Number> list, DoubleValue<? extends Number> f) {
for (Number n : list)
f.dv(n); // This line give error: The method dv(capture#2-of ? extends Number) in the type DoubleValue<capture#2-of ? extends Number> is not applicable for the arguments (Number)
}
public static void sumOfListWorking(List<? extends Number> list, DoubleValue<Number> f) {
for (Number n : list)
f.dv(n);
}
public static void sumOfListWorkingSuper(List<? extends Number> list, DoubleValue<? super Number> f) {
for (Number n : list)
f.dv(n);
}
}
sumOfListNotWorking:
在这里,我传递给DoubleValue.dv(<? extends Number> e) 一个数字,我认为没关系。
但是编译器说不是。为什么?
我希望 DoubleValue<Number>.dv 和 e -> e.doubleValue() 一样,这应该是典型的消费者:我得到了价值 <? extends Number> 并用它做点什么。
sumOfListWorkingSuper:sumOfListWorkingSuper 的行为也让我感到困惑。
接口DoubleValue<? super Number> 不能是消费者,因为<? super Number> 的值不能就地更改(数字是不可变的),但编译器可以接受。
更新:
显然我没有正确理解“生产者”和“消费者”的逻辑。
sumOfListNotWorking:
此方法无法编译,因为我使用:
-
List<? extends Number> list作为制片人(在我取出的方法中 带有循环的列表中的值)。 -
DoubleValue<? extends Number>作为消费者(在方法中我将Number传递给f.dv(n)),但是当我尝试将值Number传递给f时,编译器告诉我f被定义为生产者(<? extends Number>- 有一些值Number或它的孩子),它不能接受任何值。如果我传递给f参数DoubleValue<Integer>怎么办,那么我会尝试将Number放在Integer的位置——这是不可能的。发生所有这些错误是因为我定义了生产者而不是消费者。
感谢您指出消费者和生产者逻辑中的“接受”一词。
【问题讨论】:
-
您会在这里获得大量信息stackoverflow.com/questions/19795709/…
标签: java