Java 8 function constructor from templated object
I am using eclipse Luna service release 2 (4.4.2), Java 8 U51
I'm trying to create a method that will create an instance of the passing object based on another method parameter The prototype is simplified to
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 reports unhandled exception type invocationtargetexception compiler error consistent with function declaration I need the function to be used in the stream later
I tried to add various try / catch blocks and throw declarations, but I didn't fix this compiler error
How do I make this code work?
Solution
You cannot throw a checked exception from a lambda with a function target type because its apply method does not throw an exception Therefore, you need to set it as an unchecked exception, for example, by wrapping it:
Function<Object,Object> createFun = o -> {
try {
return constructor.newInstance(o);
} catch (InstantiationException | InvocationTargetException | illegalaccessexception e) {
throw new RuntimeException(e);
}
};
Another way is to guide the compiler to consider it an unchecked exception and produce a clearer stack trace with the above options:
Function<Object,Object> createFun = o -> {
try {
return constructor.newInstance(o);
} catch (InstantiationException | InvocationTargetException | illegalaccessexception e) {
return uncheck(e);
}
};
Use the following practical methods:
@SuppressWarnings("unchecked")
public static <E extends Throwable,T> T uncheck(Throwable t) throws E {
throw ((E) t);
}
