2017-06-30 88 views
3

我有一個場景,我想創建一個名爲D的包含泛型方法的支持類。我已經爲類型變量設置了上限。使用類型變量泛型的調用方法

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()函數有不同的實現。我想創建一個名爲D的支持類,它具有一個顯示方法,使用顯示方法,我想根據實例調用B或C類的msg()函數。你能告訴我如何實現它?

+1

只是供參考,這些是方法,而不是功能。 – gprathour

+0

是否可以檢查** ob instanceof B ** || ** ob instanceof C **?或者,也許那不是你問的問題? – ShayHaned

+1

類'A'沒有'msg'方法,它只在子類中聲明。因此,如果'A'可以是抽象的,添加一個抽象方法,如果不是,添加一個空方法(不好首先...)。或者在'A'中重命名'show'以匹配'B'和'C'中的方法名稱(如果它們應該相同) – AxelH

回答

2

你需要有方法msg()A類,否則D類的display()方法不知道這個方法,你傳遞給它的對象存在與否。 (如果某人制作的課程E延伸A,但沒有msg()方法,並且您通過ED.display()?)。

如果你不想實現A類的msg()方法,那麼你可以把它abstract(您可能還必須使課堂abstract)。

abstract class A { 
    public abstract void msg(); 

    // ... 
} 
0

更像一種架構風格,我會用一個接口,用於這一點,所以你的泛型方法約束到哪裏<T extends If> void display(T ob)如果是用抽象方法的接口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不需要一個A對象,OP需要一些可以實現味精方法的東西 –

+0

我的意思是你不能像'A a = new B();新的D()。display(a);'。原始定義接受了什麼。當然,你失去了使用'A.show()'的可能性。這裏沒有問題,但需要指出;) – AxelH

0

你不需要泛型爲此,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(); 
    } 
} 

這裏提供給方法的適當實例將決定在運行時調用哪個類方法。