gpt4 book ai didi

java - 具有下限的嵌套通配符

转载 作者:行者123 更新时间:2023-12-05 07:54:03 25 4
gpt4 key购买 nike

因此,我通读了主要的 Java 通用常见问题解答,唯一阻碍我的是具有下限的嵌套通配符。我想给你一个我理解的例子,一些具体有效的东西以及我如何看待它。也许你可以告诉我我的想法是错误的,即使编译器在“好”的情况下没有提示。

示例 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);
}

我先看最深的通配符和绑定(bind)在WildcardMethod的签名中。它正在寻找Pair<? extends Number> .因此,我可以使用 Pair<Integer> , Pair<Double>等等。现在,如果我决定用 Pair<Integer> 代替,我脑子里就会有类似下面代码的东西。对于 Pair<? extends Number> :

List<? extends Pair<Integer>>

现在,通配符表示参数化类型的类型/子类型 Pair<Integer> .因此,我可以通过 Pair<Integer>SubPair<Integer>到通配符方法。

示例 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>> .

换句话说,我将最深的通配符视为要求最内层边界(数字)的子类型或父类(super class)型。然后我转到顶级通配符并查找泛型类型 (Pair) 的子类型/父类(super class)型。

示例 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 的父类(super class)型所以 Pair<Object>应该像前面的例子一样工作。以下是我在试图理解这一点时的想法:

? super Pair<Object>

所以我仅限于 Pair<Object>SuperPair<Object> .然而,这些都不起作用。

示例 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:

  1. List<Pair<Integer>> List<? extends Pair<? extends Number>> 的子类型?
  2. 如果Pair<Integer>Pair<? extends Number> 的子类型.是吗?
  3. 是的,因为 IntegerNumber 的子类型.

示例 2:

  1. List<Pair<Number>> List<? extends Pair<? super Number>> 的子类型?
  2. 如果Pair<Number>Pair<? super Number> 的子类型.是吗?
  3. 是的,因为 NumberNumber 的父类(super class)型.

示例 3:

  1. List<Pair<Object>> List<? super Pair<? super Number>> 的子类型?
  2. 如果Pair<Object>Pair<? super Number> 的父类(super class)型.是吗?
  3. 不,不是。具有特定参数的参数化类型永远不能是具有通配符的参数化类型的父类(super class)型。

示例 4:

  1. List<Pair<Integer>> List<? super Pair<? extends Number>> 的子类型?
  2. 如果Pair<Integer>Pair<? extends Number> 的父类(super class)型.是吗?
  3. 不,不是。具有特定参数的参数化类型永远不能是具有通配符的参数化类型的父类(super class)型。

关于java - 具有下限的嵌套通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31889837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com