在返回类型也是方法参数的上限和下限的情况下,如何推断类型

帕维尔

假设我们有以下代码:

class A {}

class B extends A {}

class C extends B {}

public static <T> T testMe(List<? super T> list1,List<? extends T> list2) {
    return null;
}

public static void main(String[] args) {
    List<B> listB = new ArrayList<>();
    List<C> listC = new ArrayList<>();
    // All three variants are possible:
    A a=testMe(listB, listC);
    B b=testMe(listB, listC);
    C c=testMe(listB, listC);
}

问题是关于public static <T> T testMe(List<? super T> list1,List<? extends T> list2)编译器如何确定T类型,如果如有三类:A,B,C,当我分析时出现了这个问题Collections.copy

格特曼

在所有3种情况下,编译器都C将为type参数推断类型T

这是适合约束的类型

推论算法试图找到最适合所有参数的类型。

对于前2条语句,

A a = testMe(listB, listC);
B b = testMe(listB, listC);

双方BC比赛,因为List<B>比赛List<? super B>List<C>比赛List<? extends B>,以及List<B>比赛List<? super C>List<C>比赛List<? extends C>编译器选择最匹配的类型C

您可以使用显式类型参数进行编译,以使编译器将其解析为B

A a = Super.<B>testMe(listB, listC);
B b = Super.<B>testMe(listB, listC);

在第三行中,仅C匹配,因此编译器会选择T

C c = testMe(listB, listC);

发生这种情况的原因是所分配的变量是类型的C,并且B不能分配给C

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何基于函数的参数推断承诺的返回类型?

在模式匹配的方法和类型的参数类型推断之间差

是否可以在Java中对类型参数同时指定上限和下限约束?

如何在不使用递归的情况下使用int返回类型方法返回FIbonacci序列?

Java通用方法:从参数类型推断返回类型的上限时不一致

下限类型的Java类型推断

如何在函数的参数中不使用类型的情况下指定函数的类型?

如何在不指定类的情况下使用显式类型参数调用Java方法?

在这种情况下,为什么对一个参数实例方法的BiConsumer的类型推断不同?

在多级继承的情况下,如何在Java中使用通用返回类型覆盖方法

如何在不知道键的类型和值的类型的情况下遍历KeyValuePair的枚举

C ++如何在模板中推断Callable的类型(参数列表和返回值)

基于参数的推断返回类型

为什么在存在类型参数默认值的情况下,类型推断对于“ HashMap”和我自己的结构的行为有所不同?

推断方法中的类型参数

在某些情况下,将auto用作返回类型和返回值nullptr

根据可变参数类型推断返回类型

存储方法的返回类型和参数类型

在这种情况下,OCaml如何推断类型?

类型参数,上限和覆盖

在存在GADT和类型家族的情况下,GHC无法推断类型

类型提示和默认参数值也是方法签名吗?

Scala类型的上限和下限

从函数返回类型推断模板参数类型

接口方法的参数类型和返回类型

如何从参数对象动态推断返回类型?

CanBuildFrom 和类型上限参数

函数参数类型推断和条件类型

如何推断函数参数的类型?