gpt4 book ai didi

来自模板化对象的 Java 8 功能构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:46:56 25 4
gpt4 key购买 nike

我正在使用 Eclipse Luna 服务版本 2 (4.4.2),Java 8 u51。

我正在尝试创建一个方法,该方法将根据另一个方法参数创建传递对象的实例。原型(prototype)简化为

public <T> T test(Object param, T instance) {
Constructor<?> constructor = instance.getClass().getConstructors()[0]; // I actually choose a proper constructor

// eclipse reports "Unhandled exception type InvocationTargetException"
Function<Object, Object> createFun = constructor::newInstance;

T result = (T) createFun.apply(param);
return result;
}

在线用Function声明eclipse报告Unhandled exception type InvocationTargetException编译器错误。我需要 Function 稍后在流中使用。

我尝试添加各种 try/catch block 、抛出声明,但没有任何方法可以修复此编译器错误。

如何使这段代码工作?

最佳答案

您不能从具有 Function 目标类型的 lambda 中抛出检查异常,因为它的 apply 方法不会抛出异常。所以你需要把它变成一个未经检查的异常,例如通过包装它:

Function<Object, Object> createFun = o -> {
try {
return constructor.newInstance(o);
} catch (InstantiationException | InvocationTargetException | IllegalAccessException e) {
throw new RuntimeException(e);
}
};

另一种方法是让编译器认为这是一个未经检查的异常,与上面的选项相比,它会产生更清晰的堆栈跟踪:

Function<Object, Object> createFun = o -> {
try {
return constructor.newInstance(o);
} catch (InstantiationException | InvocationTargetException | IllegalAccessException e) {
return uncheck(e);
}
};

使用以下实用方法:

@SuppressWarnings("unchecked")
public static <E extends Throwable, T> T uncheck(Throwable t) throws E {
throw ((E) t);
}

关于来自模板化对象的 Java 8 功能构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31470817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com