使返回类型泛型与相同的擦除二进制兼容?
我有以下课程:
public abstract Foo {
Foo() {}
public abstract Foo doSomething();
public static Foo create() {
return new SomePrivateSubclassOfFoo();
}
}
我想将其更改为以下定义:
public abstract Foo<T extends Foo<T>> {
Foo() {}
public abstract T doSomething();
public static Foo<?> create() {
return new SomePrivateSubclassOfFoo();
}
}
这个变化二进制兼容吗? 也就是说,将针对新版本的旧版本编译的代码与新版本一起工作,而无需重新编译?
我知道我需要更改SomePrivateSubclassOfFoo
,这没关系。 我也知道这个改变会在编译旧客户端代码时触发原始类型的警告,这对我也是可以的。 我只是想确保旧客户端代码不需要重新编译。
根据我的理解,这应该是可以的,因为T
的擦除是Foo
,因此字节代码中doSomething
的签名与之前相同。 如果我看看由javap -s
打印的内部类型签名,我确实看到了这一点(虽然在不使用-s
情况下打印的“非内部”类型签名确实不同)。 我也测试过这个,它对我很有用。
但是,Java API合规性检查器告诉我这两个版本不是二进制兼容的。
那么什么是正确的? JLS在这里保证二进制兼容性,还是在测试中我只是幸运的? (为什么会发生这种情况?)
链接地址: http://www.djcxy.com/p/95075.html
上一篇: Is making return type generic with same erasure binary compatible?
下一篇: Liferay api/jsonws page should be accessible only for admin users