Java JDK8 with-source 1.7[默认方法]

Java JDK8 with-source 1.7[默认方法],java,class,javac,java-8,Java,Class,Javac,Java 8,我有以下课程 公共类ZonedDateTimeToInstant{ 公共静态void main(最终字符串[]args) 抛出NoSuchMethodException{ 断言ChronoZonedDateTime.class.isAssignableFrom(ZonedDateTime.class); 安装的最终方法 =ChronoZonedDateTime.class.getMethod(“toInstant”); final ZonedDateTime now=ZonedDateTime.

我有以下课程

公共类ZonedDateTimeToInstant{
公共静态void main(最终字符串[]args)
抛出NoSuchMethodException{
断言ChronoZonedDateTime.class.isAssignableFrom(ZonedDateTime.class);
安装的最终方法
=ChronoZonedDateTime.class.getMethod(“toInstant”);
final ZonedDateTime now=ZonedDateTime.now();
final Instant Instant=now.toInstant();
System.out.println(即时);
}
}
它只是编译得很好

& 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
这正常吗?似乎除了
1.8
之外,
javac
不理解具有
-source
的JDK类

据介绍,
javac
仍然像以前的版本一样支持各种
-sourcerelease
选项

补充

我已经知道,只有Java8才提供。它与
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所述。问题在于该方法是在接口中定义的
默认方法
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
应该告诉我更有用的信息。

这是一个新的时间/日期API,在Java8中引入。这就是它不使用Java7编译的原因


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

这是由于javac中的一个错误而产生的。相关的bug有:和。这两个问题都已经解决了。如果您获得了JDK8的最新版本或从中克隆了最后一个编译器版本,您应该能够编译代码。

我知道Java 8中新包含了时间/日期API。
javac
有什么用?@JinKwon这可能是因为
toInstant()
是默认方法,而
-source 1.7
不支持默认方法。如果确实需要在JDK 1.7中使用,可以使用