Как получить поле сущности, которая передается в качестве универсального аргумента функции в Java? - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть универсальный метод, который получает любой класс сущности.Все мои сущности имеют поле createDate типа LocalDate.Я хочу получить доступ и получить поле внутри общего метода.Этот метод будет выглядеть примерно так:

public static < T > List<Resource> printArray( List<T> entity) {
    for( T e : entity ) {
        LocalDate d = e.getCreateDate(); //Wrong
    }

Я не хочу проверять экземпляр универсального аргумента и приводить его к типу, так как существует много сущностей, и я хочу, чтобы код был минимальным (следовательно,общая функция).Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 24 февраля 2019

Вы можете использовать рефлексию для вызова метода с заданным именем общего типа.

    for( T e : entity ) {
        try {
            Method method = e.getClass().getMethod("getCreateDate");
            method.invoke(e);
        }
        catch(Exception e1) {
            e1.printStackTrace();
        }                       
    }
0 голосов
/ 25 февраля 2019

Если у типов сущностей нет общего супертипа для объявления метода getCreateDate, и вы не можете изменить иерархию типов, вы должны использовать делегирование:

public static <T> List<Resource> printArray(
    List<? extends T> entities, Function<? super T, ? extends LocalDate> accessor) {

    for(T e: entities ) {
        LocalDate d = accessor.apply(e);
        // ...
    }
    // ...
}

Этот метод может быть вызванкак

printArray(listOfEntities, EntityType::getCreateDate);

, где EntityType относится к конкретному типу элемента списка.

0 голосов
/ 24 февраля 2019

Вы можете создать интерфейс с абстрактным методом getCreateDate()

interface IDate {
    LocalDate getCreateDate();
}

И при условии, что все ваши сущности реализовали этот интерфейс, ваш метод будет выглядеть так:

public static <T extends IDate> List<Resource> printArray(List<T> entity) {
    for(T e : entity ) {
        LocalDate d = e.getCreateDate();
    }
}

В противном случае вы не сможетегарантировать, что объекты, которые вы передали этому методу, имеют метод getCreateDate()

. Существует решение для отражения, предложенное @ VHS

...