这个Java类型层次结构正确吗?

3
给定类型List<?>List<Object>List<? super Number>List<Number>List<Integer>List<? extends Number>,我试图理解它们的层次结构。
我知道List<Integer>不是List<Number>的子类型,尽管Integer确实是Number的子类型,所以我认为它实际上是List<? extends Number>的子类型。
但是List<? extends Number>直观地看起来似乎是List<Number>的子类型,这使得List<Integer>最终仍然是List<Number>的子类,正如我的想法所示:
所以,如果一个类型是从另一个类型派生而来,但并非直接派生,它仍然是其祖先类型的子类型吗(或者我的图表是错误的)?这个练习也让我有些困惑?Object之间的区别...实际上,看起来我可能混淆了List<Object>List<? super Number>。我想最大的问题之一就是,“所有东西都是一个Object吗...或者所有东西都是一个??还是两者都是...或者都不是?

3
除非 List<U> -> List<V> 表示 V 是 U 的子类型,否则您的大部分图表都是不正确的。例如,List<Integer> 不是 List<Number> 的子类型 - 请参见:https://dev59.com/JHE85IYBdhLWcg3wgDvd - assylias
1个回答

2
< p>为什么 List<Integer> 不是 List<Number> 的子类型。

让我们考虑一个场景,即 List<Number> 接受 List<Integer>(这实际上是行不通的)。

  List<Integer> listI =new ArrayList<Integer>();
  List<Double>  listD = new ArrayList<Double>();
  method(listI);
  method(listD);

假设你有一个方法,它需要一个List<Number>作为参数。

   public void method(List<Number> list) {
    list.add(new Double()); // would fail if you pass an List<Integer> as Integer is not a super type of Integer.
    list.add(new Integer()); //would fail if you pass an List<Double> as Double is not a subtype of Integer       
    }     

如果你的方法参数声明为List<number>,接受List<Double>,并尝试将一个Integer添加到Double列表中,那么这是错误的。因为Double不是Integer的超类,所以List<Number>不是List<Integer>的子类型。

现在考虑相同的情况,但是方法参数为List<? extends Number>而不是List<Number>

            public void method(List<? extends Number> list) {
                      // list.add(new Double()); 
                      // list.add(new Integer());       
               }

现在你将一个 List<Integer> 传递给这个方法。如果它接受并且您尝试向 整数列表 添加一个 Double糟糕了... 您刚刚向 整数列表 添加了一个 Double
为了提供一个非正式的例子。考虑一个带有CatDog作为子类型的Animal超类型。 现在,您有一个接受 <?extends Animal> 的方法,并将一个 Dog 传递给此方法。在该方法中,您尝试添加一个Cat。这会向您的Dog添加错误类型(CAT),因此**List<Dog>**不是List<?extends Animal>的子类型。
如果这还不够清晰,请告诉我。谢谢 :)

需要注意的是,任何允许传入可能与其他参数不兼容的参数的情况。 - norman
不,如果参数不兼容,编译时会出现错误。你应该注意像将Cat添加到作为参数传递的dog列表这样的情况。在这里,你的参数将接受狗或猫,因为它们都扩展了动物,但是你应该小心在方法内添加错误的东西。 - PermGenError

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接