当前位置: 首页 > 知识库问答 >
问题:

空参数上的Vararg类型推断[重复]

上官鸿祯
2023-03-14

如果我有两个具有相同签名的方法,仅根据vararg类型变化,Java如何知道在我不使用参数或传递null时调用哪个方法?

例如,如果我有以下两种方法:

public static String test(String a, String b, Object... args){
    return "object args";
}

public static String test(String a, String b, String... args){
    return "string args";
}

我打电话给:

System.out.println(test("a", "b"));
System.out.println(test("a", "b", null));

输出是“字符串args”。为什么Java决定在这里调用第二个方法而不是第一个方法?我很难找到描述这一点的规范的相关部分。

共有1个答案

袁运良
2023-03-14

据我所知,字符串[]比对象[]更具体,因此null与字符串[]匹配;但是,如果您专门使用null,则经常需要将null转换为类型。如果参数是键入的,则不会出现此问题。

test("a", "b", (String)null);

是一样的

String foo = null;
test("a", "b", foo);
 类似资料:
  • 我的分类测试应用程序有一个问题,我使用了一个比较器。我收到一条信息: 线程“主”java.lang 中的异常:未解决的编译问题:无法推断排序器的类型参数 对于该代码: 分拣机类: 可比接口: id比较器类: 比较器接口: 这样用有什么错?我怎样才能做得更好?

  • 我目前正在研究Typescript中的重载。 假设我有一个重载的函数: 要么调用函数时没有参数,要么调用函数时有两个参数(foo和bar)。根据vscode的智能感知,结果变量具有布尔|未定义的类型。 为什么即使我已经测试了参数,仍然可以?如果存在,那么类型推断不应该预测也存在吗?

  • 我仍然在玩我的日历,我已经设法将 https://github.com/SundeepK/CompactCalendarView 整合到我的一个片段中。只剩下一个错误,我做了一些研究,其他人也遇到了问题,例如使用ArrayList 示例代码: IDE说: 注:C:...\Uebersicht.java使用或覆盖不推荐使用的API。注意:用-Xlint:deprecation重新编译以获得详细信息。

  • 我需要 Kotlin 中的一个集合来仅包含实现给定接口的元素。 例如:包含动物集合的地图: 通过阅读文档、博客和SO问题,我编写了使用Generics in关键字的代码: 现在我想在Test类中添加一个读取“data”内容的方法,例如将其打印到控制台: 如果我这样做,我会遇到编译错误: 我的解决方案是强制我的动物进入一个ArrayList 但是我不确定这是编写这种代码的最好方式。有没有更好的方式告

  • 在以下代码中: 由于lambda不可序列化,以下代码行无法编译: 我的问题是,让lambda实现可序列化有什么语法上的好处吗,还是我必须让它成为一个非匿名类?

  • 我试着做一个ArrayList,包含另一个类的对象,一个名字,还有turn。类似于python字典的东西。 所以我做了一个有三个值的类。 我试图在主类的构造函数中调用它,如下所示: 但它引发了一个错误:无法推断ArrayList的类型参数