当前位置:  开发笔记 > 编程语言 > 正文

带有-source 1.7的JDK8 [默认方法]

如何解决《带有-source1.7的JDK8[默认方法]》经验,为你挑选了1个好方法。

我有以下课程.

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不了解-source除了以外的JDK类1.8.

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

补充

我已经知道JSR 310:日期和时间API仅在Java 8中可用.它有javac什么关系?

$ cat Java8.java
public class Java8 {
    public void print(java.io.PrintStream out) {
        out.printf("hello world\n");
    }
}
$ 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所说.问题是该方法是default method在接口中定义的.javac似乎抓住了这一点.

$ cat Java8i.java
public interface Java8i {
    default void print(java.io.PrintStream out) {
        out.printf("hello world\n");
    }
}
$ 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 我应该更有帮助地告诉我.



1> Eng.Fouad..:

这是一个新的时间/日期API,它是在Java 8中引入的.这就是它不能用Java 7编译的原因.

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


@JinKwon这可能是因为`toInstant()`是一个默认方法,而`-source 1.7`不支持默认方法.
推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有