具有下限的嵌套通配符

时间:2015-08-08 05:03:27

标签: java generics wildcard

所以我阅读了主要的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);
}

我首先看看最深的通配符并绑定WildcardMethod的签名。正在寻找Pair<? extends Number>。因此,我可以使用Pair<Integer>Pair<Double>等。如果我决定将Pair<Integer>替换为Pair<? extends Number>,我现在有一些看起来像下面代码的东西:

List<? extends Pair<Integer>>

现在,通配符表示参数化类型Pair<Integer>的类型/子类型。因此,我可以将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>>

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

示例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>。但是,这些都不起作用。

示例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>但是,这也不起作用。

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

1 个答案:

答案 0 :(得分:0)

示例1:

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

    1. List<Pair<Number>>的子类型是List<? extends Pair<? super Number>>吗?
    2. 如果Pair<Number>Pair<? super Number>的子类型。是吗?
    3. 是的,因为NumberNumber
    4. 的超类型

      示例3:

      1. List<Pair<Object>>的子类型是List<? super Pair<? super Number>>吗?
      2. 如果Pair<Object>Pair<? super Number>的超类型。是吗?
      3. 不,不是。具有特定参数的参数化类型永远不能是带通配符的参数化类型的超类型。
      4. 示例4:

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