2016-04-04 10 views
0

インスタンス変数に基づいて正しいコンストラクタを選択するには、クラスCが必要です。私は以下に示す基本的なコードを持っています。クラスBのインスタンスを作成し、それをAへの参照として格納するときはいつでも、クラスCでは 'Wrong'コンストラクタが使用されます。(b instanceOf B)を使用したくない場合は、これを変更するオプションは何ですか他のパッケージ。Java、インスタンスに基づいて正しいコンストラクタを使用する

Class A { 
} 

Class B extends A { 
} 


Class C { 
    C(A a){...} 
    C(B b){...} 
} 

Class Main{ 
    private createClass(String s){ 
     if (...){ 
      return new B(); 
     } 
    } 

    public static void main(String[] args){ 
     A b = createClass("s"); 
     new C(b); //--> constructor C(A a) is used but i need C(B b) 
    } 
} 

答えて

2

new C(A a)b変数は、コンパイル時に型Aであるため、と呼ばれています。コンパイラは、実行時にBのインスタンスへの参照を保持することを知らないため、それがnew C(A a)コンストラクタにバインドされている理由がわかります。一般的に

、私はあなたがあなたのデザインを再考すべきだと思うが、あなたはこのようにそれを維持したい場合、あなたは少なくともcreateClass()方法は、一般的な作りとresulingタイプのClass<T>を渡すことができます。

private <T extends A> T createClass(String s, Class<T> clazz){ 
    if (...) { 
     return clazz.newInstance(); 
    } 
    // 
} 

これは、あなたが指摘(と簡単に切り替える)することができますあなたが必要とする結果のタイプになります。

B b = createClass("s", B.class); 
new C(b); 
0

ではなく2つのコンストラクタを使用して、単一のコンストラクタを使用してPERFするif (a instanceOf B)を使用し、BにオブジェクトをキャストクラスBに関連するすべての操作を具体的に指示する。以下のような

Class C { 
    C(A a){ 
     if(a instanceOf B){ 
      B b =(B) a; 
      // all the stuff related to B only 
     } 
     //common work for both the scenarios 
    } 
} 
+0

スニペット私は、クラスCは、同じパッケージ内にないとにClassNotFoundが解雇されるだろうように、一人で配布することができるようINSTANCEOFがオプションではないことを述べました。 – Mazmart

+0

CNFはどんな場合でも解雇されます。クラスにアクセスできない場合は、そのインスタンスと何が関係していますか? 'ClassNotFoundExceptionの場合: アプリケーションが文字列名を使用してクラスをロードしようとしたときにスローされる: 1. ClassクラスのforNameメソッド。 2. ClassLoaderクラスのfindSystemClassメソッド。 3. ClassLoaderクラスのloadClassメソッドです。 –

関連する問題