使返回类型泛型与相同的擦除二进制兼容?

我有以下课程:

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