Вызов базового метода для универсального объекта производного класса - PullRequest
0 голосов
/ 03 октября 2018

Попытка добавить базовый интерфейс с методом, чтобы все производные классы должны были реализовать метод или использовать метод по умолчанию.Каков наилучший способ получить этот вызываемый метод?См. Комментарий в блоке кода ниже.

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 голосов
/ 03 октября 2018

Кажется, вы хотите знать, как создать экземпляр класса.Предполагая, что у него есть конструктор по умолчанию, вы можете сделать это следующим образом:

private Integer newClient(Class<B> clazz){
   try {
      ((B) (clazz.getConstructor().newInstance())).doWork();
    } catch ...
}
0 голосов
/ 03 октября 2018

Закончилось поиском решения:

B.class.cast(clazz); 
0 голосов
/ 03 октября 2018

Что касается того, как убедиться, что вы вызываете метод производного класса, который переопределяет базу, то есть нативное поведение 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());
    }
}

Вывод:

0
1
1

Обратите внимание, что выходные данные, возвращаемые из b2 :: get () :: int, совпадают с b1 :: get () :: int, даже если b2 - это тип A, а b1 - это тип B. Этопотому что, хотя у нас есть только ссылка на класс A в b2, реализация объекта по-прежнему B.

...