Java中重载构造函数的显式消歧

Java中重载构造函数的显式消歧,java,constructor,null,ambiguous,disambiguation,Java,Constructor,Null,Ambiguous,Disambiguation,我知道,如果Java中有一个重载方法可以接受几种不同类型的参数,并且我想将null传递给该方法,那么我需要显式地将其转换为一种接受的类型。我的问题是,是否可以从方法本身中选择在null上调用该方法的哪个版本(例如,通过添加另一个重载来处理null) 我的问题如下-我有一个重载构造函数的类,它接受一个参数: public class MyClass { public MyClass(A arg) { // do something } public My

我知道,如果Java中有一个重载方法可以接受几种不同类型的参数,并且我想将
null
传递给该方法,那么我需要显式地将其转换为一种接受的类型。我的问题是,是否可以从方法本身中选择在
null
上调用该方法的哪个版本(例如,通过添加另一个重载来处理
null

我的问题如下-我有一个重载构造函数的类,它接受一个参数:

public class MyClass {

    public MyClass(A arg) {
        // do something
    }

    public MyClass(B arg) {
        // do something else
    }
}
用例是这样的,如果类是用
null
构造的,那么只有第二个版本的构造函数才有意义。但是每次都要做
newmyclass((B)null)
很容易出错。如果我不小心使用了对
A
的强制转换,那么就会执行错误的构造函数。我也不能在我的
A
构造函数中引入以下检查:

if (arg == null) {
    this((B)arg);
}
因为
这个(…)
不是第一条语句。当然,我可以在这个检查中复制
B
构造函数中的代码,或者引入另一种方法来做
B
构造函数所做的事情,然后在构造函数和这个检查中调用它,但这似乎不是一个“干净”的解决方案(并且可能并不总是可能的,例如在级联构造函数的情况下)

是否有一种方法可以让我只需执行
newmyclass(null)
,并且每次都执行
B
版本的构造函数

我试图添加此重载,但编译器抱怨:

public MyClass(null arg) {
    this((B)arg);
}
但是每次都要做
newmyclass((B)null)
很容易出错

如果要使用这样的裸构造函数,这是Java语言必须提供的最佳机制

但是,您可以通过将
新的
调用替换为
静态的
对象工厂方法来避免这种情况;例如

  public static MyClass newANull() {
      return new MyClass((A) null);
  }

  public static MyClass newBNull() {
      return new MyClass((B) null);
  }
(显然,您需要更好的方法名称…)


请注意,使用工厂方法还允许您每次返回相同的“ANull”或“BNull”
MyClass
实例……如果这样做是适当的话

但是每次都要做
newmyclass((B)null)
很容易出错

如果要使用这样的裸构造函数,这是Java语言必须提供的最佳机制

但是,您可以通过将
新的
调用替换为
静态的
对象工厂方法来避免这种情况;例如

  public static MyClass newANull() {
      return new MyClass((A) null);
  }

  public static MyClass newBNull() {
      return new MyClass((B) null);
  }
(显然,您需要更好的方法名称…)



请注意,使用工厂方法还允许您每次返回相同的“ANull”或“BNull”
MyClass
实例……如果这样做是适当的。

如果
a
B
都是接口,这将起作用

    public <T extends Object&A&B> MyClass(T arg)
    {
        this((B)arg);
    }

    new MyClass(null); // the 3rd constructor is chosen, which calls the 2nd
公共MyClass(T参数)
{
这((B)arg);
}
new MyClass(null);//选择第三个构造函数,它调用第二个

如果
A
B
都是接口,这将起作用

    public <T extends Object&A&B> MyClass(T arg)
    {
        this((B)arg);
    }

    new MyClass(null); // the 3rd constructor is chosen, which calls the 2nd
公共MyClass(T参数)
{
这((B)arg);
}
new MyClass(null);//选择第三个构造函数,它调用第二个

有一个调用
此((B)null)的无参数构造函数。
?@Kevin这在我的情况下有效,但在一个参数构造函数级联到多个参数构造函数的情况下无效。有一个调用
此((B)null)的无参数构造函数
?@Kevin这在我的情况下是可行的,但在一个arg构造函数级联到多个arg构造函数的情况下就不行了。有趣的解决方案,不知道像那样在
t
上有多个边界!+1有趣的解决方案,不知道像那样在
t
上有多个边界!+1我想不起来这似乎是一个不错的方法。通常使用工厂方法而不是裸构造函数更好吗?我在一些库中看到过这样做,但我自己编写代码时总是喜欢使用构造函数。“通常使用工厂方法而不是裸构造函数更好吗?”-最好在您正在开发的应用程序的上下文中使用最有效的方法…没有想到这一点,但这似乎是一个不错的方法。通常使用工厂方法而不是裸构造函数更好吗?我在一些库中看到过这种方法,但我自己编写代码时总是更喜欢使用构造函数。“通常使用工厂方法而不是裸构造函数更好吗?”-最好使用在您正在开发的应用程序上下文中最有效的方法。。。