2017-06-30 54 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(); 
    } 
} 

这里提供给方法的适当实例将决定在运行时调用哪个类方法。