泛型Java擦除>编译时类型对齐或Java库/框架代码转换为应用程序逻辑
我正在为一个复杂的分布式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
存储在我的库代码中,而不是Class<?>
以便继续。但仍然对解决方案感兴趣
# 1 楼答案
您遇到的问题是,因为方法
updateSimple
要求所有泛型类型都是T
,这意味着:任何但都是相等的但是,您分别为泛型参数指定了不同的类型
?
(任何),Object
和?
(不必与之前的相同)所以你有两个选择
<Object>
,而不是<?>
李>通常情况下,对于糟糕的面向对象设计来说,强制转换是一种代码味道,但对于第三方软件,有时你无法避免它。(在其他一些情况下,避免铸造的OO复杂性是不值得的)
如果你得到的参数真的是你所需要的类型,那么就直接转换它们。否则,请调整方法签名,使其接受范围更广的参数