Java擦除->;编译时类型对齐-或Java库/框架代码转换为应用程序逻辑
我正在为一个复杂的分布式OSGi系统设计一个配置场景 我需要在Java 7上从库代码转换为应用程序代码(下面的代码不正确):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
void someFrameworkMethod(…){
....
//arg 2属于Object类型
//服务的类型为SimpleStrongTypedManagedService
//arg 3是类的类型
updateSimple(服务,entry.getValue(),desc.getClazz());
....
}
私有void updateSimple(SimpleStrongTypedManagedService服务,
T值,
课程名称(clazz){
...
}
我可以访问相关的分类。有没有什么技巧可以让编译器“读懂我的心思”(我在上面尝试做的),或者我必须做反射/方法处理技巧
我决定只将方法句柄
存储在我的库代码中,而不是类
,以便继续。但是仍然对解决方案感兴趣。您遇到的问题是因为方法updateSimple
要求所有泛型类型都是T
,这意味着:任何类型都是相同的
但是,您分别为泛型参数指定了不同的类型<代码>?
(任意)、对象
和?
(不必与之前的相同)
所以你有两个选择
,而不是
如果您得到的参数确实是您需要的类型,那么只需强制转换它们。否则,请调整您的方法签名,使其接受范围更广的参数。…这在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) {
...
}