具有下限的嵌套通配符
Nested wildcards with lower bounds
所以我通读了 Java 通用常见问题解答的主要内容,唯一阻碍我的是具有下限的嵌套通配符。我想给你一个我理解的例子,一些具体有效的东西以及我如何看待它。也许你可以告诉我我的想法是错误的,即使编译器在 "good" 的情况下没有抱怨。
例1(有道理):
static void WildcardsMethod(List<? extends Pair<? extends Number>> list)
{
System.out.println("It worked");
}
static void TestWildcardsMethod()
{
List<Pair<Integer>> list = null;
WildcardsMethod(list);
}
我先看最深的通配符和绑定在WildcardMethod的签名中。它正在寻找 Pair<? extends Number>
。因此,我可以使用 Pair<Integer>
、Pair<Double>
等。如果我决定用 Pair<Integer>
代替 Pair<? extends Number>
:
List<? extends Pair<Integer>>
现在,通配符表示参数化类型 Pair<Integer>
的 type/subtype。因此,我可以将 Pair<Integer>
或 SubPair<Integer>
传递给 WildcardsMethod.
例2(有道理):
static void WildcardsMethod(List<? extends Pair<? super Number>> list)
{
System.out.println("It worked");
}
static void TestWildcardsMethod()
{
List<Pair<Number>> list = null;
WildcardsMethod(list);
}
我看了一下,我首先需要一个 Pair<? super Number>
,所以我决定传入 Pair<Number>
,结果如下代码:
? extends Pair<Number>
然后我查看最左边的通配符,发现我可以使用 Pair<Number>
或 SubPair<Number>
。我最终通过了 List<Pair<Number>>
.
换句话说,我认为最深的通配符要求最内层边界(数字)的子类型或超类型。然后我转到顶级通配符并寻找通用类型 (Pair) 的 subtype/supertype。
例3(没有意义):
static void WildcardsMethod(List<? super Pair<? super Number>> list)
{
System.out.println("It worked");
}
static void TestWildcardsMethod()
{
List<Pair<Object>> list = null;
WildcardsMethod(list);
}
嗯,就 Pair<? super Number>
而言,Object 绝对是 Number 的超类型,因此 Pair<Object>
应该像前面的示例一样工作。以下是我在试图理解这一点时的想法:
? super Pair<Object>
所以我只能使用 Pair<Object>
或 SuperPair<Object>
。但是,none 有效。
例4(没有意义):
static void WildcardsMethod(List<? super Pair<? extends Number>> list)
{
System.out.println("It worked");
}
static void TestWildcardsMethod()
{
List<Pair<Integer>> list = null;
WildcardsMethod(list);
}
这里也是一样。 Pair<Integer>
属于 Pair<? extends Number>
家族,结果如下:
? super Pair<Integer>
然后我可以传入 Pair<Integer>
或 SuperPair<Integer>
但是,这也不起作用。
所以我要么是在想这个错误,要么是模型适用于 extends 但不适用于 super,要么我只是遗漏了一些关于下界和嵌套通配符的东西。
示例 1:
List<Pair<Integer>>
是 List<? extends Pair<? extends Number>>
的子类型吗?
- 如果
Pair<Integer>
是 Pair<? extends Number>
的子类型。是吗?
- 是的,因为
Integer
是 Number
的子类型。
示例 2:
List<Pair<Number>>
是 List<? extends Pair<? super Number>>
的子类型吗?
- 如果
Pair<Number>
是 Pair<? super Number>
的子类型。是吗?
- 是的,因为
Number
是 Number
的超类型。
示例 3:
List<Pair<Object>>
是 List<? super Pair<? super Number>>
的子类型吗?
- 如果
Pair<Object>
是 Pair<? super Number>
的超类型。是吗?
- 不,不是。具有特定参数的参数化类型永远不能是具有通配符的参数化类型的超类型。
例4:
List<Pair<Integer>>
是 List<? super Pair<? extends Number>>
的子类型吗?
- 如果
Pair<Integer>
是 Pair<? extends Number>
的超类型。是吗?
- 不,不是。具有特定参数的参数化类型永远不能是具有通配符的参数化类型的超类型。
所以我通读了 Java 通用常见问题解答的主要内容,唯一阻碍我的是具有下限的嵌套通配符。我想给你一个我理解的例子,一些具体有效的东西以及我如何看待它。也许你可以告诉我我的想法是错误的,即使编译器在 "good" 的情况下没有抱怨。
例1(有道理):
static void WildcardsMethod(List<? extends Pair<? extends Number>> list)
{
System.out.println("It worked");
}
static void TestWildcardsMethod()
{
List<Pair<Integer>> list = null;
WildcardsMethod(list);
}
我先看最深的通配符和绑定在WildcardMethod的签名中。它正在寻找 Pair<? extends Number>
。因此,我可以使用 Pair<Integer>
、Pair<Double>
等。如果我决定用 Pair<Integer>
代替 Pair<? extends Number>
:
List<? extends Pair<Integer>>
现在,通配符表示参数化类型 Pair<Integer>
的 type/subtype。因此,我可以将 Pair<Integer>
或 SubPair<Integer>
传递给 WildcardsMethod.
例2(有道理):
static void WildcardsMethod(List<? extends Pair<? super Number>> list)
{
System.out.println("It worked");
}
static void TestWildcardsMethod()
{
List<Pair<Number>> list = null;
WildcardsMethod(list);
}
我看了一下,我首先需要一个 Pair<? super Number>
,所以我决定传入 Pair<Number>
,结果如下代码:
? extends Pair<Number>
然后我查看最左边的通配符,发现我可以使用 Pair<Number>
或 SubPair<Number>
。我最终通过了 List<Pair<Number>>
.
换句话说,我认为最深的通配符要求最内层边界(数字)的子类型或超类型。然后我转到顶级通配符并寻找通用类型 (Pair) 的 subtype/supertype。
例3(没有意义):
static void WildcardsMethod(List<? super Pair<? super Number>> list)
{
System.out.println("It worked");
}
static void TestWildcardsMethod()
{
List<Pair<Object>> list = null;
WildcardsMethod(list);
}
嗯,就 Pair<? super Number>
而言,Object 绝对是 Number 的超类型,因此 Pair<Object>
应该像前面的示例一样工作。以下是我在试图理解这一点时的想法:
? super Pair<Object>
所以我只能使用 Pair<Object>
或 SuperPair<Object>
。但是,none 有效。
例4(没有意义):
static void WildcardsMethod(List<? super Pair<? extends Number>> list)
{
System.out.println("It worked");
}
static void TestWildcardsMethod()
{
List<Pair<Integer>> list = null;
WildcardsMethod(list);
}
这里也是一样。 Pair<Integer>
属于 Pair<? extends Number>
家族,结果如下:
? super Pair<Integer>
然后我可以传入 Pair<Integer>
或 SuperPair<Integer>
但是,这也不起作用。
所以我要么是在想这个错误,要么是模型适用于 extends 但不适用于 super,要么我只是遗漏了一些关于下界和嵌套通配符的东西。
示例 1:
List<Pair<Integer>>
是List<? extends Pair<? extends Number>>
的子类型吗?- 如果
Pair<Integer>
是Pair<? extends Number>
的子类型。是吗? - 是的,因为
Integer
是Number
的子类型。
示例 2:
List<Pair<Number>>
是List<? extends Pair<? super Number>>
的子类型吗?- 如果
Pair<Number>
是Pair<? super Number>
的子类型。是吗? - 是的,因为
Number
是Number
的超类型。
示例 3:
List<Pair<Object>>
是List<? super Pair<? super Number>>
的子类型吗?- 如果
Pair<Object>
是Pair<? super Number>
的超类型。是吗? - 不,不是。具有特定参数的参数化类型永远不能是具有通配符的参数化类型的超类型。
例4:
List<Pair<Integer>>
是List<? super Pair<? extends Number>>
的子类型吗?- 如果
Pair<Integer>
是Pair<? extends Number>
的超类型。是吗? - 不,不是。具有特定参数的参数化类型永远不能是具有通配符的参数化类型的超类型。