我正在研究复杂的分布式OSGi系统的配置方案。
我需要在Java 7上进行以下从库代码到应用程序代码的转换(以下代码不正确):
void someFrameworkMethod(...) {
....
// arg 2 is of type Object
// service is of type SimpleStrongTypedManagedService<?>
// arg 3 is of type Class<?>
updateSimple( service, entry.getValue(), desc.getClazz());
....
}
private <T> void updateSimple( SimpleStrongTypedManagedService<T> service,
T value,
Class<T> clazz) {
...
}
我可以访问相关的clazz
。是否有任何技巧让编译器“读我的想法”(我上面试图做的)或者我将不得不做反射/ MethodHandle技巧?
我决定只将MethodHandle
存储在我的库代码而不是Class<?>
中,以便继续使用。仍然对解决方案感兴趣。
答案 0 :(得分:1)
您遇到的问题是因为方法updateSimple
要求所有泛型类型都为T
,这意味着:除了全部等于!
但是,您分别为通用参数指定了不同的类型。 ?
(任意),Object
和?
(不必与之前的相同)。
所以你有两个选择
<Object>
而不是<?>
。正常情况下,施法是面向对象设计不良的代码气味,但对于第三方软件,您有时无法避免它。 (在其他一些情况下,避免铸造的OO复杂性是不值得的)。
如果您获得的参数确实属于您需要的类型,那么只需投射它们即可。否则调整您的方法签名,以便它接受更广泛的参数。