传递 null 时选择哪个构造函数?

发布于 2024-09-28 21:37:55 字数 536 浏览 2 评论 0 原文

在下面的示例中,我有 2 个构造函数:一个采用 String,另一个采用自定义对象。在此自定义对象上存在一个方法“getId()”,该方法返回一个字符串。

public class ConstructorTest {
 private String property;

 public ConstructorTest(AnObject property) {
  this.property = property.getId();
 }

 public ConstructorTest(String property) {
  this.property = property;
 }

 public String getQueryString() {
  return "IN_FOLDER('" + property + "')";
 }
}

如果我将 null 传递给构造函数,则会选择哪个构造函数,为什么?在我的测试中,选择了 String 构造函数,但我不知道这种情况是否总是如此以及为什么。

我希望有人能为我提供一些对此的见解。

提前致谢。

In the following example, I have 2 constructors: one that takes a String and one that takes a custom object. On this custom object a method "getId()" exists which returns a String.

public class ConstructorTest {
 private String property;

 public ConstructorTest(AnObject property) {
  this.property = property.getId();
 }

 public ConstructorTest(String property) {
  this.property = property;
 }

 public String getQueryString() {
  return "IN_FOLDER('" + property + "')";
 }
}

If I pass null to the constructor, which constructor is chosen and why? In my test the String constructor is chosen, but I do not know if this will always be the case and why.

I hope that someone can provide me some insight on this.

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

南汐寒笙箫 2024-10-05 21:37:55

通过这样做:

ConstructorTest test = new ConstructorTest(null);

编译器会抱怨说:

构造函数ConstructorTest(AnObject)
是有歧义的。

JVM 无法选择要调用哪个构造函数,因为它无法识别与构造函数匹配的类型(请参阅:15.12.2.5 选择最具体的方法)。

您可以通过对参数进行类型转换来调用特定构造函数,例如:

ConstructorTest test = new ConstructorTest((String)null);

ConstructorTest test = new ConstructorTest((AnObject)null);

更新:感谢@OneWorld,可以访问相关链接(在撰写本文时是最新的) 此处

By doing this:

ConstructorTest test = new ConstructorTest(null);

The compiler will complain stating:

The constructor ConstructorTest(AnObject)
is ambiguous.

The JVM cannot choose which constructor to invoke as it cannot identify the type that matches the constructor (See: 15.12.2.5 Choosing the Most Specific Method).

You can call specific constructor by typecasting the parameter, like:

ConstructorTest test = new ConstructorTest((String)null);

or

ConstructorTest test = new ConstructorTest((AnObject)null);

Update: Thanks to @OneWorld, the relevant link (up to date at the time of writing) can be accessed here.

Oo萌小芽oO 2024-10-05 21:37:55

编译器会产生错误。

The compiler will generate error.

┈┾☆殇 2024-10-05 21:37:55

Java 使用它可以根据参数找到的最具体的构造函数。
PS:如果您添加构造函数 (InputStream) ,编译器将因歧义而抛出错误 - 它无法知道更具体的内容:String或InputStream,因为它们位于不同的类层次结构中。

Java uses the most specific contructor it can find according to arguments.
PS: if you add constructor (InputStream) , compiler will throw error because of ambiguety - it cannot know what is more specific: String or InputStream, because they are in different class hierarchy.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文