Джава. Как я могу использовать отражение типа upcast? - PullRequest
1 голос
/ 19 октября 2011

У меня есть два класса UpObj и DownObj

public class UpObj {

    public UpObj() {
        System.out.println("Load UpObj ");
    }

}

public class DownObj extends UpObj {

    public DownObj() {
        System.out.println("Load DownObj ");
    }

}
public class Caller {

    UpObj obj;

    public Caller(UpObj obj) {
        this.obj = obj;
        System.out.println("!!!");
    }

}
public class GNUMakeFile {

    /**
     * @param args
     */
    public static void main(String[] args) {
        DownObj iView = new DownObj();
        Class<?> iViewClass = iView.getClass();
        Class<?> clazz;
        try {
            clazz = Class.forName("bla.bla.bla.Caller");
            Constructor<?> ctor = clazz.getDeclaredConstructor(iViewClass);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

    }

}

Итак, я хочу выгрузить свой дочерний тип DownObj до родительского UpObj в конструкторе Caller.Я думаю, что это возможно с помощью дженериков.Что-то вроде этого .Кто-нибудь знает, как именно это использовать.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 19 октября 2011

Вы не должны использовать Class.getConstructor() с типом времени выполнения того, что вы хотите передать ему - метод работает с формальными параметрами.

Если вам нужно найти конструктор, который соответствует некоторым имеющимся у вас объектам, вам придется перебрать getConstructors(), проверить формальные параметры каждого конструктора и проверить, нашли ли вы подходящая подпись с использованием Class.isAssignableFrom(). Я не думаю, что есть удобный способ сделать так, чтобы API отражения разрешал вам перегрузки.

(Либо переосмыслите свой подход, чтобы больше не мешать с отражением.)

0 голосов
/ 19 октября 2011

Я не совсем понял проблему - апкастинг обычно не нужен.
но кажется, что проблема в том, чтобы получить верхний класс объекта,
если использовать метод getSuperclass:

    Constructor<?> ctor = clazz.getDeclaredConstructor(iViewClass.getSuperclass());

Документация: getSuperclass ()

0 голосов
/ 19 октября 2011

Нет стандартного способа сделать это.Попробуйте поискать в Google некоторые решения, например, http://www.xinotes.org/notes/note/1329/ или Как получить типы параметров, используя отражение? .Насколько я помню, Spring и некоторые другие библиотеки имеют аналогичные функции утилит для этого.Вы пользуетесь пружиной?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...