首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java擦除->编译时类型对齐-或Java /Framework代码转换为应用程序逻辑

Java擦除->编译时类型对齐-或Java /Framework代码转换为应用程序逻辑
EN

Stack Overflow用户
提问于 2015-02-23 20:00:24
回答 1查看 68关注 0票数 2

我正在为一个复杂的分布式OSGi系统开发一个配置场景。

我需要在Java 7上从库代码转换为应用程序代码(下面的代码不正确):

代码语言:javascript
复制
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<?>中。但仍然对解决方案感兴趣。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-24 11:11:20

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

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

所以你有两个选择

  1. 删除所有泛型参数必须相同的要求。
  2. 转换您的参数,使它们都是<Object>而不是<?>

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

如果您正在获得的参数确实是您所需的类型,那么只需转换它们。否则,修改您的方法签名,使其接受范围更广的参数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28682349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档