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问题。
考虑一个编写为使用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设计人员将不得不为集合创建一组并行的类和接口。即
由于Java类型等效项基于类型名称/标识而不是基于签名的(或鸭子类型)等效项,因此这两个集合层次结构将不兼容。这意味着使用集合的API和实现需要在1.5之前和1.5之后的集合之间进行选择。混合它们会很尴尬……而且效率低下。
对于需要使用旧版Java库和应用程序的人员/组织而言,最终结果将是一个大问题。基本上,迁移到Java 1.5意味着很多重写工作正常的应用程序。那会杀死泛型,而Java将成为企业语言。
我们无法为您提供具体的示例,这些示例在通用语言是基于模板和/或没有擦除的Java语言中无法证明是有效的。
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |