为什么Java要求1.5版本需要向后兼容?

Man*_*DIP 1 java generics backwards-compatibility java1.4 java-5

Java 1.5是与泛型一起发布的,他们希望它与早期版本向后兼容,因此Java禁止在创建原始实例时使用方法特定的泛型。

例如

class A<T> {
    <U> U myMethod(U u) {
        return u;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我做 ,

A a = new A();
Run Code Online (Sandbox Code Playgroud)

a.myMethod将要求我将Object作为输入传递,其返回类型为Object。显然,类类型参数'T'与myMethod()特定的泛型'U'不冲突。但是Java却以某种方式表示,为了处理向后兼容性,它们会删除原始实例使用的所有泛型。

别人多次问了上述问题,所有答案都只说了一次,因为与早期版本的向后兼容性Java不允许这样做。[点]。

但是,没有一个答案提供了一个实例,以防Java允许对原始实例使用方法特定的泛型,而在早期版本中可能会失败。

任何人都可以通过提供一个特定的实例(如果他们允许的话)在1.5之前的早期版本中出现问题的情况来提供帮助吗?

请不要提供其他与问题无关的,没有答案的stackoverflow问题。

Ste*_*n C 5

考虑一个编写为使用Java 1.5之前的Java集合类型的Java程序。

在Java 1.5之前,我会写

 List l = new ArrayList();
 l.append("Hello");
 l.append("World");
 String hello = (String) l.get(0);
Run Code Online (Sandbox Code Playgroud)

现在有了类型擦除模型,我可以在Java 1.5或更高版本中编译该代码,甚至不需要编译器警告。但是我也可以用现代的方式使用完全相同的集合类。例如

 List<String> l = new ArrayList<>();
 l.append("Hello");
 l.append("World");
 String hello = l.get(0);
Run Code Online (Sandbox Code Playgroud)

请注意,在两个示例中我都使用相同的类和接口。

如果没有删除模型来解决问题,Java设计人员将不得不为集合创建一组并行的类和接口。即

  • 1.5版之前的集合,没有泛型和类型参数
  • 具有泛型和类型参数的1.5版之后的集合

由于Java类型等效项基于类型名称/标识而不是基于签名的(或鸭子类型)等效项,因此这两个集合层次结构将不兼容。这意味着使用集合的API和实现需要在1.5之前和1.5之后的集合之间进行选择。混合它们会很尴尬……而且效率低下。

对于需要使用旧版Java库和应用程序的人员/组织而言,最终结果将是一个大问题。基本上,迁移到Java 1.5意味着很多重写工作正常的应用程序。那会杀死泛型,而Java将成为企业语言。


我们无法为您提供具体的示例,这些示例在通用语言是基于模板和/或没有擦除的Java语言中无法证明是有效的。

  • 该假设的Java语言不存在。
  • 如果开发人员付出了足够的精力,则任何1.5之前的Java程序都可以移植到这种语言。