首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于java 8向后兼容性的问题: JDK中的新方法

关于java 8向后兼容性的问题: JDK中的新方法
EN

Stack Overflow用户
提问于 2016-01-12 22:39:39
回答 2查看 944关注 0票数 5

简单的问题。在Java 8中,JDK类中有大量的新方法。假设我们使用Java 7(或Java 6)创建了这样的类:

代码语言:javascript
复制
class MyArrayList<E> extends ArrayList<E> {
        public void sort(Comparator<E> c) {
            // some sort
        }
}

这是相当合理的实施。现在,我们尝试用Java 8编译它,并接收可预期的编译错误:

代码语言:javascript
复制
error: name clash: sort(Comparator<E#1>) in MyArrayList and sort(Comparator<? super E#2>) in ArrayList have the same erasure, yet neither overrides the other
            public void sort(Comparator<E> c) {
                        ^   where E#1,E#2 are type-variables:
    E#1 extends Object declared in class I.MyArrayList
    E#2 extends Object declared in class ArrayList

在此,我想提出两个问题:

  1. 即使使用JDK 8的javac -source 1.7 -target 1.7选项,我也会收到相同的错误--为什么?我认为这些选项应该允许编译遗留代码。
  2. 一般的向后兼容性如何?

编辑准确地说,可能是我做错什么了吗?JDK 1.8.0_65,Mac:

代码语言:javascript
复制
bash-3.2$ javac -version
javac 1.8.0_65
bash-3.2$ javac -source 1.7 -target 1.7 MyArrayList.java 
warning: [options] bootstrap class path not set in conjunction with -source 1.7
MyArrayList.java:7: error: name clash: sort(Comparator<E#1>) in MyArrayList and sort(Comparator<? super E#2>) in ArrayList have the same erasure, yet neither overrides the other
    public void sort(Comparator<E> c) {
                ^
  where E#1,E#2 are type-variables:
    E#1 extends Object declared in class MyArrayList
    E#2 extends Object declared in class ArrayList
1 error
1 warning
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-12 22:47:04

  1. 因为即使有这些选项,您仍然在针对Java 8类进行编译。JDK不知道哪些方法出现在JDK的哪个版本中。所有这些选项都告诉编译器只接受正在编译的代码中的Java 7语法,并生成Java 7字节码。您必须传递到JDK 7类的实际链接(使用-bootclasspath选项)才能交叉编译。
  2. 是的,这是个问题。不是很大,拥有所有这些新的默认方法的好处比使用一些罕见的非编译代码所带来的不便更重要。
票数 8
EN

Stack Overflow用户

发布于 2016-01-12 22:47:24

  1. -source 1.7只说源代码使用Java7语言特性。-target 1.7说输出的字节码以JVM的特定版本为目标。但是,您仍然在使用JDK 8进行编译。
  2. 接口中的默认方法 (Java8中引入的)允许您在不破坏现有代码的情况下添加新功能。这不是一个防弹的解决方案,可能存在一些小问题(这个答案对问题做了一些详细解释)。但是总的来说,向后兼容性问题是非常罕见的。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34755121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档