'переопределенный метод не вызывает исключение' при использовании лямбда с выброшенным исключением переопределения

Чтобы предотвратить закрытие как дубликат, этот вопрос полностью отличается от этого вопроса< /а>.

У меня есть следующий интерфейс

@FunctionalInterface
interface FuncE0<R, E extends Exception> {
  R call() throws E;
}

С лямбдой нормально работает

FuncE0<Integer, IOException> get() {
  return () -> 1;
}

Но если я позволю интерфейсу расширяться от Callable, он сломается.

@FunctionalInterface
interface FuncE0<R, E extends Exception> extends Callable<R> {
  @Override
  R call() throws E;
}

При том же использовании. Complier дает мне следующую ошибку

JustTest.java:8: error: call() in <anonymous JustTest$> cannot implement call() in FuncE0
    return () -> 1;
           ^   overridden method does not throw Exception
  • Если вы удалите метод переопределения R call() throws E в FuncE0, он сработает.
  • Если вы используете анонимный класс, он работает.
  • Если вы используете eclipse, ECJ работает.

Что произошло, когда я переопределяю созданное исключение? Это ошибка джавака?

Я использую jdk_1.8_112

Минимизируйте код для воспроизведения

import java.io.IOException;
import java.util.concurrent.Callable;

public class JustTest {
  public static FuncE0<Integer, IOException> get() {
    return () -> 1;
  }

  @FunctionalInterface
  public interface FuncE0<R, E extends Exception> extends Callable<R> {
    @Override
    R call() throws E;
  }
}

person Dean Xu    schedule 13.08.2018    source источник
comment
ваш код работает для меня без каких-либо проблем   -  person Deadpool    schedule 13.08.2018
comment
Хорошо компилируется с jdk-9.0.4 и jdk-10.0.2, но не с jdk1.8.0_181. Также отлично компилируется с компилятором Eclipse Photon, даже в режиме совместимости с Java 8.   -  person Andreas    schedule 13.08.2018
comment
при использовании анонимного класса вместо лямбды работает в 1.8.0_131   -  person Lino    schedule 13.08.2018
comment
@Deadpool Какую версию ты используешь?   -  person Dean Xu    schedule 13.08.2018
comment
@Andreas Андреас Могу ли я считать, что это было исправлено в jdk-9?   -  person Dean Xu    schedule 13.08.2018
comment
для меня java version "1.8.0_171" это работает   -  person Deadpool    schedule 13.08.2018


Ответы (1)


Это ошибка jdk, которая была исправлена ​​1.8.0_171 (возможно, не самая низкая версия исправления).

person Community    schedule 03.12.2018