【发布时间】:2015-10-06 21:06:15
【问题描述】:
我正在使用 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;
}
在线与Function声明eclipse报Unhandled exception type InvocationTargetException编译错误。我需要 Function 稍后在流中使用。
我尝试添加各种 try/catch 块,抛出声明,但没有解决此编译器错误。
如何使这段代码工作?
【问题讨论】:
-
您认为
Function绕道与简单地在Constructor上调用newInstance相比有什么优势? -
@Holger 我在
Constructor流中使用newInstance,它产生了相同的消息,所以我创建了一个这样的SSCE。函数detour其实是需要保持一个相对可读的stream()链的。 -
我明白了。因此,关于用例和 assylias 建议的 lambda 表达式应该可以工作,所以它有点过于简单化了。但是我现在想知道的是,对于结果类型是否真的是
instance的确切类型(可能是T的子类),是否真的有硬性要求,换句话说,是否诉诸反射真的很有必要…… -
@Holger 我找不到无反射的解决方案。该方法确实用于 T 的许多子类。我想要一个定义清晰但可能很难看但实现单一的方法。我最终传递了一个
Class<T>而不是 T 的实例。 -
嗯,使用
Class排除了结果是该类的子类的可能性。如果你在调用者的站点上有一个已知的具体类型,那么像Function<A,B> f=B::new;这样的构造应该是可能的。如果调用者本身是通用的,它就不会那么容易工作,但它必须从某个地方获取Class对象,不是吗?也许有一个无反射的解决方案,但这似乎值得提出另一个问题(有关用例的更多信息)......
标签: java eclipse generics functional-programming java-8