Java 已擦除 -> 编译时类型对齐 - 或 Java Library/Framework 代码转换为应用程序逻辑
Java erased -> compile time type alignment - or Java Library/Framework code transitioning to application logic
我正在处理一个复杂的分布式 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
。是否有任何技巧可以让编译器达到 "read my mind"(我在上面尝试做的事情),或者我是否必须进行反射/方法处理技巧?
我决定只在我的库代码中存储 MethodHandle
而不是 Class<?>
以便继续进行。不过仍然对解决方案感兴趣。
您遇到的问题是因为方法 updateSimple
要求所有泛型类型都是 T
,这意味着:任何但全部相等!
但是,您分别为泛型参数指定了不同的类型。 ?
(任意)、Object
和 ?
(不必与之前的相同)。
所以你有两个选择
- 放弃所有通用参数都相同的要求。
- 投射你的参数,使它们都是
<Object>
而不是 <?>
。
通常情况下,强制转换是糟糕的面向对象设计的代码味道,但对于第 3 方软件,您有时无法避免它。 (在其他一些情况下,避免强制转换的 OO 复杂性是不值得的)。
如果你得到的参数确实是你需要的类型,那么就转换它们。否则调整您的方法签名,使其接受更广泛的参数。
我正在处理一个复杂的分布式 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
。是否有任何技巧可以让编译器达到 "read my mind"(我在上面尝试做的事情),或者我是否必须进行反射/方法处理技巧?
我决定只在我的库代码中存储 MethodHandle
而不是 Class<?>
以便继续进行。不过仍然对解决方案感兴趣。
您遇到的问题是因为方法 updateSimple
要求所有泛型类型都是 T
,这意味着:任何但全部相等!
但是,您分别为泛型参数指定了不同的类型。 ?
(任意)、Object
和 ?
(不必与之前的相同)。
所以你有两个选择
- 放弃所有通用参数都相同的要求。
- 投射你的参数,使它们都是
<Object>
而不是<?>
。
通常情况下,强制转换是糟糕的面向对象设计的代码味道,但对于第 3 方软件,您有时无法避免它。 (在其他一些情况下,避免强制转换的 OO 复杂性是不值得的)。
如果你得到的参数确实是你需要的类型,那么就转换它们。否则调整您的方法签名,使其接受更广泛的参数。