在派生类的通用对象上调用基础方法

时间:2018-10-02 21:09:41

标签: java class generics multiple-inheritance

尝试添加带有方法的基本接口,以便所有派生类都必须实现该方法或使用默认方法。使该方法可调用的最佳方法是什么?请参阅下面的代码块中的注释。

public interface IA{}  

public interface IB{   
  public Integer doWork();  
}  

public interface IC extends IB{
}

class B implements IB{
  Integer doWork(){
     return 2;
  }
}

class C extends B implements IC{
   @Override
   Integer doWork(){
     return 7;
  }
}

//What do I need to do to cast clazz to an object so I can call the derived class' doWork method?
private Integer newClient(Class<T> clazz){
  ((B) clazz).doWork();
}

3 个答案:

答案 0 :(得分:1)

最终找到了解决方案:

B.class.cast(clazz); 

答案 1 :(得分:0)

关于如何确保您调用覆盖基类的派生类的方法,这是Java的本机行为。

示例程序:

BizFormItemEvents.Insert.After

输出:

public class Foo {
    static class A {
        int get() { return 0; }
    }

    static class B extends A {
        @Override
        int get() { return 1; }
    }

    public static void main(final String[] args)
    {
        A a = new A();
        B b1 = new B();
        A b2 = new B();

        printA(a);
        printA(b1);
        printA(b2);
    }

    public static <T extends A> void printA(T bObj) {
        System.out.println(bObj.get());
    }
}

请注意,即使b2是A类型且b1是B类型,从b2 :: get():: int返回的输出也与b1 :: get():: int相同。这是因为即使我们在b2中仅具有对A类的引用,对象实现仍然是B。

答案 2 :(得分:0)

似乎您只想知道如何实例化Class。假设它具有默认构造函数,则可以通过以下方式实现:

private Integer newClient(Class<B> clazz){
   try {
      ((B) (clazz.getConstructor().newInstance())).doWork();
    } catch ...
}