gpt4 book ai didi

java - Varags 对象处理异常

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:26:37 25 4
gpt4 key购买 nike

我不认为我理解可变参数如何处理传入的对象:

public class NoSense {

public static void someMethod(String a, Object... things) {

System.err.println("a->" + a);

System.err.println(things.getClass().getName());

for (Object object : things) {
System.err.println("thing->" + object);
}


}


public static void main(String[] args) {
String[] x = new String[] { "what", "is", "up?" };
NoSense.someMethod("1", x);
NoSense.someMethod("2", x, "extra");
}

结果是

a->1
[Ljava.lang.String;
thing->what
thing->is
thing->up?
a->2
[Ljava.lang.Object;
thing->[Ljava.lang.String;@4d20a47e
thing->extra

为什么它会将第一个集合视为字符串数组,而将第二个集合视为对象数组引用?

最佳答案

为了保持向后兼容性,可变参数是编译器尝试解析方法调用的最后一件事。因为调用 NoSense.someMethod("1", x); 可以解析为 someMethod(String a, Object[] things),所以它是这样解析的。它可以做到这一点,因为数组类型是协变的。

调用NoSense.someMethod("2", x, "extra"); 但是,不能解析为someMethod(String a, Object[] things),因此使用可变参数创建一个 new Object[]{x, "extra"},然后将其作为 things 参数传递。

关于java - Varags 对象处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5009555/

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