我正在为一个复杂的分布式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<?>中。但仍然对解决方案感兴趣。
发布于 2015-02-24 11:11:20
您遇到的问题是,因为方法updateSimple要求所有泛型类型都是T,这意味着:除所有相同外,任何都是相等的!
但是,您为泛型参数分别提供了不同的类型。? (any)、Object和? (不必与之前相同)。
所以你有两个选择
<Object>而不是<?>。通常情况下,转换对于糟糕的面向对象设计来说是一种代码嗅觉,但是在第三方软件中,您有时无法避免它。(在其他一些情况下,避免转换的OO复杂性是不值得的)。
如果您正在获得的参数确实是您所需的类型,那么只需转换它们。否则,修改您的方法签名,使其接受范围更广的参数。
https://stackoverflow.com/questions/28682349
复制相似问题