gpt4 book ai didi

java - 类型推断如何用于方法调用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:12:43 25 4
gpt4 key购买 nike

考虑以下示例:

public class Learn {
public static <T> T test (T a, T b) {
System.out.println(a.getClass().getSimpleName());
System.out.println(b.getClass().getSimpleName());
b = a;
return a;
}

public static void main (String[] args) {
test("", new ArrayList<Integer>());
}
}

main方法,我正在调用 testString和一个 ArrayList <Integer>目的。两者是不同的东西并分配一个 ArrayListString (通常)给出编译错误。

String aString = new ArrayList <Integer> (); // won't compile

但我在 test 的第 3 行正是这么做的并且程序编译并运行良好。首先我认为类型参数 T替换为与 String 兼容的类型和 ArrayList (如 Serializable )。但是两个println里面的语句test将“String”和“ArrayList”打印为 a 的类型和 b分别。我的问题是,如果 aStringbArrayList在运行时,我们如何分配 ab .

最佳答案

对于泛型方法,Java 编译器将 infer the most specific common type对于两个参数 ab .

The inference algorithm determines the types of the arguments and, if available, the type that the result is being assigned, or returned. Finally, the inference algorithm tries to find the most specific type that works with all of the arguments.

您没有将调用结果分配给 test任何东西,所以没有目标影响推理。

在这种情况下,即使是StringArrayList<Integer>有一个共同的父类(super class)型,Serializable , 所以 T被推断为 Serializable ,并且您始终可以将同一类型的一个变量分配给另一个变量。对于其他示例,您甚至可以找到 Object作为公共(public)父类(super class)型。

但仅仅因为你有 T 类型的变量被推断为 Serializable , 对象本身仍然是一个 String和一个 ArrayList , 所以获取他们的类(class)并打印他们的名字仍然打印 StringArrayList .您没有打印变量的类型;您正在打印对象的类型。

关于java - 类型推断如何用于方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50007890/

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