【问题标题】:How is ? different then saying object?怎么 ?不同于说对象?
【发布时间】: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&lt;Object extends Number&gt;,或者List&lt;Object&gt;,或者......什么?
  • “为什么我不能在 for each 循环中有一个整数”,因为您的列表不一定由 Integers 组成 - 如果它是 List&lt;Double&gt; 怎么办?
  • 是的,确实如此,但是基于extend的上限规则,它不应该工作吗?
  • 你的最后一个例子对我来说编译得很好。您可以这样做,因为numbers 中的每个元素都是Integer
  • 你的逻辑倒退了。如果你有一盒水果,你不能说水果是苹果。苹果是水果这一事实不会改变任何事情。它可能是一盒香蕉或梨。而且香蕉不是苹果。

标签: java eclipse generics methods wildcard


【解决方案1】:

首先,让我们描述一下当你说&lt;T extends Number&gt; 时你在做什么。这在编译器的脑海中说的是,“使用 T 作为对必须扩展 Number 类的泛型的引用”。所以,为了解决你的第一个问题,

首先,用对象替换通配符有何不同?
你真的什么都没做,“不同”。您所做的只是说“使用 word 对象作为对...的泛型的引用”事实上,如果您要尝试这样做:
public class Subclass<java.lang.Object extends Number>

编译器会报错:Check class headers... parsing individual files failed! 这是因为你实际上并没有使用Object,而是word 对象。请参阅泛型教程中的Type Parameter Naming Conventions

其他两个问题的答案参考dorukayhan的回答。

【讨论】:

    【解决方案2】:

    我写了下面的方法,有和没有通配符。首先,用对象替换通配符有什么不同?

    如果你用Object 代替问号,这个方法会更难使用。

    class Foo<T>{}
    
    class Bar{
        static void barfoo(Foo<Object> foo){}
        public static void main(String[] args){
            barfoo(new Foo<Bar>()); // Doesn't compile
        }
    }
    

    在这个方法中没有下图的通配符为什么可以放入参数?

    该方法有一个类型参数T,其中extends Number。由于这个类型参数,编译器知道任何传递给该方法的List&lt;T&gt; 都将包含数字。

    如果? extends Number 那么为什么我不能在 for each 循环中有一个整数,如下所示?

    如果numbers 不是ListIntegers 怎么办?因为它的类型参数只需要扩展Number,它也可能是Doubles。或Longs。甚至BigDecimals。

    【讨论】:

      猜你喜欢
      • 2011-05-04
      • 2021-10-18
      • 2015-03-30
      • 2020-09-08
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      相关资源
      最近更新 更多