создание обобщенной c функции переназначения - PullRequest
0 голосов
/ 25 марта 2020

У меня есть класс, полный разных списков, и я хочу простой способ переназначения их значений. Поэтому я попытался создать обобщенный c метод переназначения, подобный этому

private List<Row> list = new ArrayList<>();

@Builder(toBuilder = true)
@Data
private class Row {
    private String data;
}
public <T> void reMap(Class<T> builderClass, Function<T, T> rowMapper) {
    if(builderClass.equals(Row.class)) {
        list = list.stream().map(Row::toBuilder).map(rowMapper).map(Row::build).collect(Collectors.toList());
    }
}

, но он жалуется на rowMapper высказывание

reason: no instance(s) of type variable(s) exist so that RowBuilder conforms to T

Трудно понять, почему это и есть ли приличный способ обойти это?

1 Ответ

2 голосов
/ 25 марта 2020

Трудно понять, почему это так, и есть ли приличный способ обойти это?

Простой ответ: потому что вы (способны) знать больше, чем компилятор.

Вы проверяете, что builderClass равно Row. В том случае, если это так, компилятор не «запоминает», что: то есть, вы должны продолжать говорить компилятору, что он есть, например, путем приведения.

Но тогда компилятор не знать что-нибудь об отношениях между Row и RowBuilder классами. С точки зрения системы типов нет никакой связи: это всего лишь два класса.

Итак, есть ли приличный способ обойти это? Нет, не совсем. Если возможно, старайтесь не делать это с генериками.

...