2

我正在研究复杂分布式 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<?>为了继续使用。不过仍然对解决方案感兴趣。

4

1 回答 1

1

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

但是,您分别为泛型参数提供不同的类型。?(any), Objectand ?(不必与之前的相同)。

所以你有两个选择

  1. 放弃所有泛型参数相同的要求。
  2. 转换您的参数,使它们全部<Object>而不是<?>.

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

如果您获得的参数确实是您需要的类型,那么只需转换它们。否则调整您的方法签名,使其接受更广泛的参数。

于 2015-02-24T11:11:20.823 回答