Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java擦除->;编译时类型对齐-或Java库/框架代码转换为应用程序逻辑_Java_Generics_Java 7_Erasure - Fatal编程技术网

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

Java擦除->;编译时类型对齐-或Java库/框架代码转换为应用程序逻辑,java,generics,java-7,erasure,Java,Generics,Java 7,Erasure,我正在为一个复杂的分布式OSGi系统设计一个配置场景 我需要在Java 7上从库代码转换为应用程序代码(下面的代码不正确): void someFrameworkMethod(…){ .... //arg 2属于Object类型 //服务的类型为SimpleStrongTypedManagedService //arg 3是类的类型 updateSimple(服务,entry.getValue(),desc.getClazz()); .... } 私有void updateSimple(Simp

我正在为一个复杂的分布式OSGi系统设计一个配置场景

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

void someFrameworkMethod(…){
....
//arg 2属于Object类型
//服务的类型为SimpleStrongTypedManagedService
//arg 3是类的类型
updateSimple(服务,entry.getValue(),desc.getClazz());
....
}
私有void updateSimple(SimpleStrongTypedManagedService服务,
T值,
课程名称(clazz){
...
}
我可以访问相关的
分类。有没有什么技巧可以让编译器“读懂我的心思”(我在上面尝试做的),或者我必须做反射/方法处理技巧



我决定只将
方法句柄
存储在我的库代码中,而不是
,以便继续。但是仍然对解决方案感兴趣。

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

但是,您分别为泛型参数指定了不同的类型<代码>?
(任意)、
对象
(不必与之前的相同)

所以你有两个选择

  • 删除所有通用参数都相同的要求
  • 强制转换参数,使它们都是
    ,而不是
  • 通常情况下,对于糟糕的面向对象设计来说,强制转换是一种代码味道,但对于第三方软件,有时你无法避免它。(在其他一些情况下,避免强制转换的OO复杂性是不值得的)


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

    …这在Java 6上有效吗?我看到这一点,认为如果您告诉我
    arg2
    确实绑定到
    Object
    ,那么
    T
    将绑定到
    Object
    。您能告诉我们,哪一部分是您的(需要进一步修改)?另外,如果使用了一些lib,您能告诉我们哪些是lib,并带有指向它们的javadoc的链接吗?这两部分都是我的,代码的这一部分没有使用lib。我只需要找到一种调用updateSimple的方法。这是错误:
    类型ConfigServiceCollection中的方法updateSimple(SimpleStrongTypedManagedService,T,Class)不适用于参数(SimpleStrongTypedManagedService,Object,Class)
    我试图编写我的助手方法以某种方式获得“类型占位符”——即,
    来自未知“类型占位符”
    。这就是为什么我认为提供类标记会对编译器有所帮助。所以我想我的问题是,当我只有类标记时,如何转换接口和值。
    是有效的“类型占位符”吗“在铸造中使用?不幸的是,当我转到
    MethodHandle
    时,我不再有关于代码的问题了,正如你提到的,这是一种更好的方法。然而,再次阅读您的答案,将
    void updateSimple(Object-iface、Object-value、Class-clazz)是我要找的签名吗?我将在铸造这两个参数之后立即执行
    face.update(value)
    。该
    updateSimple
    签名确实允许您使用T铸造其他参数。请注意,对于第一个参数,您可能实际上需要
    SimpleStrongTypedManagedService
    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) {
            ...
        }