Java 对派生类的泛型对象调用基方法

Java 对派生类的泛型对象调用基方法,java,class,generics,multiple-inheritance,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; } } cla

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

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();
}
公共接口IA{}
公共接口IB{
公共整数doWork();
}  
公共接口IC扩展IB{
}
类实现IB{
整数doWork(){
返回2;
}
}
类C扩展了B实现了IC{
@凌驾
整数doWork(){
返回7;
}
}
//我需要做什么才能将clazz强制转换为对象,以便调用派生类的doWork方法?
私有整数新客户端(clazz类){
(B)clazz.doWork();
}

至于如何确保调用重写基的派生类方法,这是Java的本机行为

示例程序:

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::get()::int返回的输出与b1::get()::int相同,即使b2是类型A,b1是类型B。这是因为,即使我们在b2中只有对A类的引用,对象实现仍然是B。

您似乎只想知道如何实例化该类。假设它有一个默认构造函数,您可以这样做:

private Integer newClient(Class<B> clazz){
   try {
      ((B) (clazz.getConstructor().newInstance())).doWork();
    } catch ...
}
private Integer新客户端(clazz类){
试一试{
((B)(clazz.getConstructor().newInstance()).doWork();
}抓住。。。
}

最终找到了解决方案:

B.class.cast(clazz); 

我正在研究如何使它在类似代码块中最后一个方法的情况下可调用。我知道覆盖批注。你已经在做了。如果传入的类是C类型,则可以将clazz强制转换为B类型的类(尽管如果您不想将类的类型限制为扩展B或实现IB的类,我会添加一个instanceof check),那么调用将调用C类的函数实现,即使您只将其强制转换为B类型的类。很抱歉,我忽略了@Powerlord指出的内容。我已经编辑了我的回复,以包括您应该做什么的示例。A是一个类描述符,而不是所述类的
对象。
B.class.cast(clazz);