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

标签 java eclipse generics functional-programming java-8

我正在使用 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/

相关文章:

android - 为什么 Android xml 布局文件无法通过 ctrl+space 识别内容辅助?

java - 编辑布局会导致元素混合

java - 获取 SessionBean 实例

java - 如何为泛型 SortedLinkedList 创建泛型类型 T 数组?

java - 在 android 应用程序中嵌入 youtube channel

java - 图像减法的错误结果

java - 复制 Intent/更改源 Activity 和目标类

java - 查看 int[][] 是否包含特定值

java - 不需要的通用参数

arrays - 将枚举数组转换为其代表字符串数组