Java 11 Предикат лямбда-выражения generi c тип ClassCastException - PullRequest
0 голосов
/ 08 января 2020

У меня проблема с java 11 типом лямбда-выражения предиката generi c типа, когда я пишу предикат, поскольку лямбда-выражение не возвращает точно параметр generi c, и возникает ClassCastException, код показан ниже

Объяснение Когда мы пишем лямбда-выражение, Generi c Метод параметров getGenericInterfaces () [0] -> ClassCastException встречается в этой строке, потому что не обнаруживается параметр generi c, когда я отлаживаю код, рассматриваемый как просто Условие не Условие <>, в любом случае, когда мы определяем предикат, как показано ниже (рабочий случай), его рабочий

Рабочий случай

Condition<Integer> oddValueCondition = new Condition<Integer>() {
    @Override
    public boolean test(Integer integer) {
        return integer % 2 == 0;
    }
};

Не рабочий случай

Condition<Integer> oddValueCondition = integer -> integer % 2 == 0;

определение интерфейса

@FunctionalInterface
public interface Condition<T> extends Predicate<T> {
    default Class<T> getParameterType() {
        ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericInterfaces()[0];
        Type[] typeArguments = parameterizedType.getActualTypeArguments();
        Class<T> type = (Class<T>) typeArguments[0];
        return type;
    }
}

Test

oddValueCondition.getParameterType();

Так что вы думаете о том, что не работает, когда мы просто пишем лямбда-выражение?

А также я создал проблему на github OpenJDK

, если они говорят, что TypeReference Hack не работает с анонимным классом и лямбда-выражением, я приму ответ

1 Ответ

1 голос
/ 08 января 2020

Лямбда-выражения и анонимные внутренние классы не компилируются в одно и то же byte-code.

Хак TypeReference не работает с лямбда-выражением, так как информация о типах недоступна через этот API. И, кстати, это было так с Java 1.8.

...