具有下限的嵌套通配符

所以我阅读了主要的Java通用常见问题解答,让我掌握的一件事就是具有下限的嵌套通配符。 我想举例说明我所理解的内容,具体哪些有效,以及我如何看待它。 也许你可以告诉我我正在考虑的方式这是错误的,即使编译器没有抱怨“好”的情况。

示例1(有意义):

static void WildcardsMethod(List<? extends Pair> list) { System.out.println("It worked"); } static void TestWildcardsMethod() { List<Pair> list = null; WildcardsMethod(list); } 

我首先看看最深的通配符并绑定WildcardMethod的签名。 它正在寻找Pair Pair 。 因此,我可以使用PairPair等。 如果我决定用Pair代替Pair我现在有一些看起来像下面代码的东西Pair Pair

 List<? extends Pair> 

现在,通配符表示参数化类型Pair的类型/子类型。 因此,我可以将PairSubPair传递给WildcardsMethod。

例2(有意义):

 static void WildcardsMethod(List<? extends Pair> list) { System.out.println("It worked"); } static void TestWildcardsMethod() { List<Pair> list = null; WildcardsMethod(list); } 

我看,我首先需要一Pair Pair所以我决定传入Pair得到以下代码:

 ? extends Pair 

然后我查看最左边的通配符,看看我可以使用PairSubPair 。 我最终通过List<Pair>

换句话说,我看到最深的通配符是要求最内层边界(Number)的子类型或超类型。 然后我转到顶级通配符并查找generics类型(Pair)的子类型/超类型。

例3(没有意义):

 static void WildcardsMethod(List<? super Pair> list) { System.out.println("It worked"); } static void TestWildcardsMethod() { List<Pair> list = null; WildcardsMethod(list); } 

那么,对于Pair Pair ,Object绝对是Number的超类型,因此Pair应该像前面的例子一样工作。 以下是我在试图理解这一点时的想法:

 ? super Pair 

所以我只能使用PairSuperPair 。 但是,这都不起作用。

例4(没有意义):

 static void WildcardsMethod(List<? super Pair> list) { System.out.println("It worked"); } static void TestWildcardsMethod() { List<Pair> list = null; WildcardsMethod(list); } 

这是同样的事情。 Pair属于Pair的家族Pair Pair结果如下:

 ? super Pair 

然后,我可以传递PairSuperPair但是,这也不起作用。

所以我要么想到这个错误,不知何故该模型适用于扩展,但不适用于超级或我只是缺少关于下边界和嵌套通配符的东西。

例1:

  1. List>List>的子类型List> List> List>
  2. 如果PairPair的子类型Pair Pair 。 是吗?
  3. 是的,因为IntegerNumber的子类型。

例2:

  1. List>List>的子类型List> List> List>
  2. 如果PairPair的子类型Pair Pair 。 是吗?
  3. 是的,因为NumberNumber的超类型。

例3:

  1. List>List>的子类型List> List> List>
  2. 如果PairPair的超类型Pair Pair 。 是吗?
  3. 不它不是。 具有特定参数的参数化类型永远不能是带有通配符的参数化类型的超类型。

例4:

  1. List>List>的子类型List> List> List>
  2. 如果PairPair的超类型Pair Pair 。 是吗?
  3. 不它不是。 具有特定参数的参数化类型永远不能是带有通配符的参数化类型的超类型。