Java擦除 - >编译时间类型对齐 - 或转换为应用程序逻辑的Java库/框架代码

时间:2015-02-23 20:00:25

标签: java generics java-7 erasure

我正在研究复杂的分布式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<?>中,以便继续使用。仍然对解决方案感兴趣。

1 个答案:

答案 0 :(得分:1)

您遇到的问题是因为方法updateSimple要求所有泛型类型都为T,这意味着:除了全部等于!

但是,您分别为通用参数指定了不同的类型。 ?(任意),Object?(不必与之前的相同)。

所以你有两个选择

  1. 删除所有通用参数相同的要求。
  2. 投射您的参数,使其全部为<Object>而不是<?>
  3. 正常情况下,施法是面向对象设计不良的代码气味,但对于第三方软件,您有时无法避免它。 (在其他一些情况下,避免铸造的OO复杂性是不值得的)。

    如果您获得的参数确实属于您需要的类型,那么只需投射它们即可。否则调整您的方法签名,以便它接受更广泛的参数。