我有以下课程。
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
以外1.8
的JDK类。
根据javac,javac
仍支持以前版本的各种-source release
选项。
补编
我已经知道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 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
应该更有帮助地告诉我。
答案 0 :(得分:12)
这是Java 8中引入的一个新的时间/日期API。这就是为什么它不能用Java 7编译。
toInstant()
是默认方法,而-source 1.7
不支持默认方法(Java 8的新功能)。
答案 1 :(得分:3)
这是因为javac中的错误而产生的。相关错误包括:JDK-8029240和JDK-8030855。这两个问题都已修复。如果您从langtools dev repo获得最新版本的JDK8或克隆最后一个编译器版本,那么您应该能够编译代码。