具有下限的嵌套通配符
所以我阅读了主要的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
。 因此,我可以使用Pair
, Pair
等。 如果我决定用Pair
代替Pair
我现在有一些看起来像下面代码的东西Pair
Pair
:
List<? extends Pair>
现在,通配符表示参数化类型Pair
的类型/子类型。 因此,我可以将Pair
或SubPair
传递给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
然后我查看最左边的通配符,看看我可以使用Pair
或SubPair
。 我最终通过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
所以我只能使用Pair
或SuperPair
。 但是,这都不起作用。
例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
然后,我可以传递Pair
或SuperPair
但是,这也不起作用。
所以我要么想到这个错误,不知何故该模型适用于扩展,但不适用于超级或我只是缺少关于下边界和嵌套通配符的东西。
例1:
-
List
是> List extends Pair extends Number>>
的子类型List extends Pair extends Number>>
List extends Pair extends Number>>
List extends Pair extends Number>>
? - 如果
Pair
是Pair extends Number>
的子类型Pair extends Number>
Pair extends Number>
。 是吗? - 是的,因为
Integer
是Number
的子类型。
例2:
-
List
是> List extends Pair super Number>>
的子类型List extends Pair super Number>>
List extends Pair super Number>>
List extends Pair super Number>>
? - 如果
Pair
是Pair super Number>
的子类型Pair super Number>
Pair super Number>
。 是吗? - 是的,因为
Number
是Number
的超类型。
例3:
-
List
是> List super Pair super Number>>
的子类型List super Pair super Number>>
List super Pair super Number>>
List super Pair super Number>>
? - 如果
Pair
是Pair super Number>
的超类型Pair super Number>
Pair super Number>
。 是吗? - 不它不是。 具有特定参数的参数化类型永远不能是带有通配符的参数化类型的超类型。
例4:
-
List
是> List super Pair extends Number>>
的子类型List super Pair extends Number>>
List super Pair extends Number>>
List super Pair extends Number>>
? - 如果
Pair
是Pair extends Number>
的超类型Pair extends Number>
Pair extends Number>
。 是吗? - 不它不是。 具有特定参数的参数化类型永远不能是带有通配符的参数化类型的超类型。