加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – JDK8 with -source 1.7 [默认方法]

发布时间:2020-12-14 05:24:57 所属栏目:Java 来源:网络整理
导读:我有以下课 public class ZonedDateTimeToInstant { public static void main(final String[] args) throws NoSuchMethodException { assert ChronoZonedDateTime.class.isAssignableFrom(ZonedDateTime.class); final Method toInstant = ChronoZonedDateTi
我有以下课
public class ZonedDateTimeToInstant {

    public static void main(final String[] args)
        throws NoSuchMethodException {

        assert ChronoZonedDateTime.class.isAssignableFrom(ZonedDateTime.class);
        final Method toInstant
            = ChronoZonedDateTime.class.getMethod("toInstant");

        final ZonedDateTime now = ZonedDateTime.now();
        final Instant instant = now.toInstant();

        System.out.println(instant);
    }
}

它只是编译罚款.

& javac ZonedDateTimeToInstant.java

并且它与-source 1.7失败.

& javac -source 1.7 ZonedDateTimeToInstant.java
ZonedDateTimeToInstant.java:10: error: cannot find symbol
    final Instant instant = now.toInstant();
                               ^
  symbol:   method toInstant()
  location: variable now of type ZonedDateTime
1 error
1 warning

这是正常吗?看来javac不了解除1.8以外的-source的JDK类.

根据javac,javac仍然支持各种-source版本选项,就像以前的版本一样.

补充

我已经知道JSR 310: Date and Time API仅在Java 8中可用.与javac有什么关系?

$cat Java8.java
public class Java8 {
    public void print(java.io.PrintStream out) {
        out.printf("hello worldn");
    }
}
$javac Java8.java
$cat Java7.java
public class Java7 {
    public static void main(final String[] args) {
        new Java8().print(System.out);
    }
}
$javac -source 1.7 -target 1.7 Java7.java
warning: [options] bootstrap class path not set in conjunction with -source 1.7
1 warning
$java Java7
hello world

结论

正如@ Eng.Fouad所说.问题是该方法是在接口中定义的默认方法. javac似乎抓住了这一点.

$cat Java8i.java
public interface Java8i {
    default void print(java.io.PrintStream out) {
        out.printf("hello worldn");
    }
}
$javac Java8i.java
$cat Java8c.java
public class Java8c implements Java8i {
}
$javac Java8c.java
$cat Java7i.java
public class Java7i {
    public static void main(final String[] args) {
        new Java8c().print(System.out);
    }
}
$javac -source 1.7 -target 1.7 Java7i.java
warning: [options] bootstrap class path not set in conjunction with -source 1.7
Java7i.java:3: error: cannot find symbol
    new Java8c().print(System.out);
                ^
  symbol:   method print(PrintStream)
  location: class Java8c
1 error
1 warning

javac应该更有帮助地告诉我.

解决方法

这是在Java 8中引入的新的Time / Date API.这就是为什么它不能用Java 7编译.

toInstant()是一个默认方法,而-source 1.7不支持默认方法(Java 8的新功能).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读