1

いくつかの異なる型のパラメーターを受け入れることができるオーバーロードされたメソッドがJavaにありnull、そのメソッドに渡したい場合は、受け入れられた型の1つに明示的にキャストする必要があることを知っています。私の質問は、nullメソッド自体の中から呼び出されるメソッドのバージョンを選択することは可能ですか(たとえば、を処理するために別のオーバーロードを追加することによってnull)?

私の問題は次のとおりです-1つのパラメーターを受け入れるオーバーロードされたコンストラクターを持つクラスがあります:

public class MyClass {

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

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

ユースケースは、クラスがで構築されている場合、コンストラクターnullの2番目のバージョンのみが意味をなすようなものです。しかし、new MyClass((B)null)毎回やらなければならないことはエラーが発生しやすいです。誤ってキャストを使用すると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 に答える