加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 23:48:00 所属栏目:Java 来源:网络整理
导读:我正在使用 Eclipse Luna Service Release 2(4.4.2),Java 8 u51. 我正在尝试创建一个方法,该方法将基于另一个方法参数创建传递对象的实例.原型简化为 public T T test(Object param,T instance) { Constructor? constructor = instance.getClass().getConstr
我正在使用 Eclipse Luna Service Release 2(4.4.2),Java 8 u51.

我正在尝试创建一个方法,该方法将基于另一个方法参数创建传递对象的实例.原型简化为

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;
}

与函数声明一致的eclipse报告未处理的异常类型InvocationTargetException编译器错误.我需要函数以后在流中使用.

我试图添加各种try / catch块,抛出声明,但没有修复此编译器错误.

如何使这段代码工作?

解决方法

您不能从具有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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读