有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

泛型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) 个答案

  1. # 1 楼答案

    您遇到的问题是,因为方法updateSimple要求所有泛型类型都是T,这意味着:任何但都是相等的

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

    所以你有两个选择

    1. 放弃所有通用参数都相同的要求
    2. 强制转换参数,使它们都是<Object>,而不是<?>

    通常情况下,对于糟糕的面向对象设计来说,强制转换是一种代码味道,但对于第三方软件,有时你无法避免它。(在其他一些情况下,避免铸造的OO复杂性是不值得的)

    如果你得到的参数真的是你所需要的类型,那么就直接转换它们。否则,请调整方法签名,使其接受范围更广的参数