从JDK8升级到JDK11后,出现了奇怪的java.lang.InstanceionException和java.lang.NoSuchMethodException

从JDK8升级到JDK11后,出现了奇怪的java.lang.InstanceionException和java.lang.NoSuchMethodException,java,generics,exception,lambda,java-11,Java,Generics,Exception,Lambda,Java 11,我有以下代码,在JDK8下构建并运行良好: @FunctionalInterface public interface ThrowingFunction<T, R, E extends Throwable> { R apply(T t) throws E; static <T, R, E extends Throwable> Function<T, R> unchecked (ThrowingFunction<T, R, E> f

我有以下代码,在JDK8下构建并运行良好:

@FunctionalInterface
public interface ThrowingFunction<T, R, E extends Throwable> {
    R apply(T t) throws E;

    static <T, R, E extends Throwable> Function<T, R> unchecked (ThrowingFunction<T, R, E> function) {
        return t -> {
            try {
                return function.apply(t);
            }
            catch (Throwable e) {
                throw new RuntimeException(e);
            }
        };
    }
}
有人能解释一下它不开心的地方是什么以及如何修复它吗

有人能解释一下它不开心的地方是什么以及如何修复它吗

E
通用类型替换为实际的
可丢弃类型

@FunctionalInterface
public interface ThrowingFunction<T, R> {
    R apply(T t) throws Throwable;

    static <T, R> Function<T, R> unchecked(ThrowingFunction<T, R> function) {
        return t -> {
            try {
                return function.apply(t);
            } catch (Throwable e) {
                throw new RuntimeException(e);
            }
        };
    }
}
@functioninterface
公共接口功能{
R应用(T)可丢弃;
未选中静态功能(ThrowingFunction){
返回t->{
试一试{
返回函数。应用(t);
}捕获(可丢弃的e){
抛出新的运行时异常(e);
}
};
}
}
。。。下面的代码在JDK8下构建并运行良好

我认为问题源于捕获机制,该机制与
E
泛型不兼容,并与以下语句相关:

如果泛型类是Throwable(.

由于Java虚拟机的捕获机制仅适用于非泛型类,因此需要此限制

坦率地说,这只是一个猜测,我不知道为什么JDK11可以复制,而JDK8却不能复制——这很奇怪


我希望我至少帮助你解决了这个问题。

正如我所说,我相信这是有关系的,但这仍然是我的猜测。最好等待一个更合格、完整的答案,而不接受这个问题的解决(取决于你,这取决于你是否同意我提供的小问题)。不过,我很高兴你无论如何都能找到它。
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile) on project cron-api: Compilation failure: Compilation failure: 
[ERROR] /java/org/foo/src/main/java/org/foo/jobs/CronJobDuplicationCheckStrategiesRegistry.java:[26,120] unreported exception java.lang.NoSuchMethodException; must be caught or declared to be thrown
[ERROR] /java/org/foo/src/main/java/org/foo/src/main/java/org/foo/cron/jobs/CronJobDuplicationCheckStrategiesRegistry.java:[27,109] unreported exception java.lang.InstantiationException; must be caught or declared to be thrown
@FunctionalInterface
public interface ThrowingFunction<T, R> {
    R apply(T t) throws Throwable;

    static <T, R> Function<T, R> unchecked(ThrowingFunction<T, R> function) {
        return t -> {
            try {
                return function.apply(t);
            } catch (Throwable e) {
                throw new RuntimeException(e);
            }
        };
    }
}