2009-04-06 8 views
5

私はint[]またはStringのいずれかを受け入れることができるオーバーロードされたコンストラクタをJavaで使用しようとしています。変数がnull文字列であるか、null配列である場合、このコンストラクタ呼び出しではあいまいであることを示すコンパイルエラーが発生しています。オーバーロードされたコンストラクタのあいまいさ

簡単な方法はありますか?

+0

私の元の質問が間違っていて、何が正しいと言うのが難しいので、私はここで答えを受け入れていません。 入力のためにありがとう –

答えて

16

キャストタイプのいずれかの引数:

Foo f1 = new Foo((int[]) null); 
// or 
Foo f2 = new Foo((String) null); 
5

最も簡単な方法 - nullを避けます。空の場合String""を使用してください。空の場合int[]new int[]を使用してください。

あなたはキャストを使用するか、または変数にnullを割り当てることができます質問に答えるために:あなたがすべてでそれをやろうとしている場合、旧

new MyClass((String)null) 

final String nullString = null; 
new MyClass(nullString) 

は一般的に、好ましいです。

4

おそらく、引数なしでコンストラクタを追加できます。

+0

null値にいくつかの特定の意味がある場合は、これがおそらく最適な解決策です。 –

+0

新しいMyClass((String)null)と新しいMyClass((int [])null)が同じものを意味するかどうかによって異なります。 (私は、オーバーロードされた裸のコンストラクタではなく、静的な作成メソッドがとても好きです。) –

2

インスタンス化するクラスを管理している場合は、静的ファクトリメソッドを使用して2つの別々の名前を付けることができ、オーバーロードに関連する混乱を避けることができます。

public static Foo createFromIntArray(final int[] ints) { ... } 
public static Foo createFromString(final String str) { ... } 

それ以外の場合は、nullを表しているかどうかを判断します。intのヌル配列かヌル文字列かあなたが作っているクラスは、別のものを重ねて与えられたとき、異なった振る舞いをする可能性があります。あなたのnullが何を表しているのか分かったら、それをコンストラクタの呼び出しでその型にキャストするだけです。あなたが明示的にnullの代わりにこのコンストラクタにオブジェクト参照を渡すかもしれないよう

new Foo((String) null); 
new Foo((int[]) null); 

は最後に、それが聞こえます。おそらく、あなたはjava.util.Mapから何かを得ているでしょう。もしそうなら、このオブジェクトをinstanceofでテストし、問題のコンストラクタに送る前に適切な型にキャストすることができます。

関連する問題