2017-06-30 15 views
3

ジェネリックメソッドを含むDという1つのサポートクラスを作成したいというシナリオがあります。私は変数の型の上限を設定しました。型変数ジェネリック型を使用してメソッドを呼び出す

class A{ 
    void show(){ 
     System.out.println("Hello A"); 
    } 
} 

class B extends A{ 
    void msg(){ 
     System.out.println("Hello B"); 
    } 
} 

class C extends A{ 
    void msg(){ 
     System.out.println("Hello C"); 
    } 
} 

class D{ 
    <T extends A> void display(T ob){ 
     ob.msg(); //here i want to do some tricks 
    } 
} 

まずは自分の目的を分かちたいです。ここで、BとCクラスのmsg()関数の実装は異なります。私はdisplayメソッドを使って1つの表示メソッドを持つDという1つのサポートクラスを作成したいと思います。インスタンス化に依存するB(または)のクラスのmsg()関数を呼び出したいと思います。どうすれば達成できるのか教えていただけますか?

+1

ちょうどFYI、これらはメソッドであり、関数ではありません。 – gprathour

+0

** ob instanceof B ** ||を確認することはできません。 ** ob instanceof C **?それともあなたが求めているものではないでしょうか? – ShayHaned

+1

クラス 'A'は' msg'メソッドを持たず、サブクラスでのみ宣言します。だから、 'A'が抽象的である場合、抽象メソッドを追加します。そうでない場合は、空のメソッドを追加します(最初はうまくいかない...)。または、 'A'の' show'の名前を 'B'と' C'のメソッド名に一致するように変更します(同じでなければならない場合) – AxelH

答えて

2

あなたは、この方法は、あなたがそれを渡しているオブジェクトには存在しないか、そうでない場合、クラスDdisplay()方法がわからない、クラスA方法msg()を持っている必要があります。 (EAに拡張するが、msg()メソッドを持たないクラスを作成し、ED.display()に渡すとどうなるでしょうか?)。

あなたはクラスAmsg()メソッドを実装したくない場合は、それabstract作ることができます(そして、あなたはまた、クラスabstractを行う必要があります)。より多くの建築様式などの

abstract class A { 
    public abstract void msg(); 

    // ... 
} 
0

あなたの一般的な方法があればあなたが必要としない抽象メソッドmsg

interface If { 
    void msg(); 
} 

class A { 
    void show() { 
     System.out.println("Hello A"); 
    } 
} 

class B extends A implements If { 
    @Override 
    public void msg() { 
     System.out.println("Hello B"); 
    } 
} 

class C extends A implements If { 
    @Override 
    public void msg() { 
     System.out.println("Hello C"); 
    } 
} 

class D { 
    <T extends If> void display(T ob) { 
     ob.msg(); // here i want to do some tricks 
    } 
} 
+0

メソッド定義が変更されていませんか?もう 'A'インスタンスを渡すことはできません。しかし実際には、これはきれいな解決策です。 – AxelH

+1

OPはオブジェクトを必要としません.OPはmsgメソッドを実装できる何かを必要とします。 –

+0

私はあなたが 'A = new B();新しいD()。ディスプレイ(a); '。元の定義が受け入れていたもの。もちろん、 'A.show()'を使う可能性は失われます。ここに問題はないが、これを指摘する必要がある;) – AxelH

0

とのインターフェースである<T extends If> void display(T ob)に制限して、私は、そのためのインターフェイスを使用しますジェネリックには、Javaの動的バインディングと呼ばれる基本的な概念があります。

abstract class A{ 
    void show(){ 
     System.out.println("Hello A"); 
    }  
    abstract void msg();  
} 

class B extends A{ 
    @Override 
    void msg(){ 
     System.out.println("Hello B"); 
    } 
} 

class C extends A{ 

     @Override 
     void msg(){ 
      System.out.println("Hello C"); 
     } 
} 

class D{ 
    void display(A ob){ 
     ob.msg(); 
    } 
} 

ここで、メソッドに提供される適切なインスタンスによって、実行時に呼び出されるクラスメソッドが決定されます。

関連する問題