1

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

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

public class MyClass {

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

    public MyClass(B arg) {
        // do something else
    }
}

用例是这样的,如果类是用 a 构造的null,那么只有构造函数的第二个版本才有意义。但是new MyClass((B)null)每次都必须这样做很容易出错。如果我不小心使用了转换 to A,则会执行错误的构造函数。而且我也不能在我的A构造函数中引入以下检查:

if (arg == null) {
    this((B)arg);
}

因为this(...)不是第一个声明。当然,我可以在此检查中复制构造函数中的代码B,或者引入另一种方法来执行B构造函数所做的事情,然后从构造函数内部和此检查中调用它,但这看起来不像“干净”解决方案(并且可能并不总是可能的,例如在级联构造函数的情况下)。

有没有办法让我只需要每次都执行构造函数new MyClass(null)的版本?B

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

public MyClass(null arg) {
    this((B)arg);
}
4

2 回答 2

4

但是new MyClass((B) null)每次都必须这样做很容易出错。

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

但是您可以通过用对象工厂方法替换new调用来避免这种情况;static例如

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

  public static MyClass newBNull() {
      return new MyClass((B) null);
  }

(显然,您需要更好的方法名称......)


请注意,使用工厂方法还允许您执行诸如每次返回相同的“ANull”或“BNull”MyClass实例之类的操作……如果这是合适的做法。

于 2012-11-12T00:41:41.430 回答
1

如果两者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
于 2012-11-12T01:34:40.777 回答