【发布时间】:2016-11-03 01:39:04
【问题描述】:
我写了下面的方法,有和没有通配符。首先,用对象替换通配符有什么不同?
public void sumOfNumbers(List<? extends Number>numbers){
int sum=0;
for(Number n:numbers){
sum+=n.intValue();
}
System.out.println(sum);
}
在这个方法中没有下图的通配符为什么可以放入参数?
public<T extends Number> void sumOfNumbers(List<T>numbers){
int sum=0;
for(Number n:numbers){
sum+=n.intValue();
}
System.out.println(sum);
}
最后,如果? extends Number 那么为什么我不能在 for each 循环中有一个整数,如下所示?
public void sumOfNumbers(List<? extends Number>numbers){
int sum=0;
for(Integer n:numbers){//Why cant I do this??
sum+=n.intValue();
}
System.out.println(sum);
}
另外,为什么你可以在 for each 循环中放入数字,在这种情况下,整数不是上限?不是下面这个数字吗?
public void sumOfNumbers(List<? extends Integer>numbers){
int sum=0;
for(Integer n:numbers){//Why cant I do this??
sum+=n.intValue();
}
System.out.println(sum);
}
【问题讨论】:
-
我不明白你在第一种情况下要问什么——你是在问为什么你不能写
List<Object extends Number>,或者List<Object>,或者......什么? -
“为什么我不能在 for each 循环中有一个整数”,因为您的列表不一定由
Integers 组成 - 如果它是List<Double>怎么办? -
是的,确实如此,但是基于extend的上限规则,它不应该工作吗?
-
你的最后一个例子对我来说编译得很好。您可以这样做,因为
numbers中的每个元素都是Integer。 -
你的逻辑倒退了。如果你有一盒水果,你不能说水果是苹果。苹果是水果这一事实不会改变任何事情。它可能是一盒香蕉或梨。而且香蕉不是苹果。
标签: java eclipse generics methods wildcard