JDK8 with -source 1.7 [默认方法] [英] JDK8 with -source 1.7 [Default Methods]
问题描述
我有以下类。
public class ZonedDateTimeToInstant {
public static void main(final String [] args)
throws NoSuchMethodException {
assert ChronoZonedDateTime.class.isAssignableFrom(ZonedDateTime.class);
final方法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:错误:找不到符号
final Instant instant = now.toInstant();
^
符号:方法toInstant()
location:变量现在的类型ZonedDateTime
1错误
1警告
这是正常吗?看起来 javac
不能理解 -source
而不是 1.8
。
根据 javac , javac
仍支持各种 -source release
我已经知道
a href =http://jcp.org/en/jsr/detail?id=310 =nofollow> JSR 310:日期和时间API 仅在Java 8中可用。它有什么重要与 javac
? $ cat Java8.java
class Java8 {
public void print(java.io.PrintStream out){
out.printf(hello world\\\
);
}
}
$ 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类路径未与-source配合使用1.7
1 warning
$ java Java7
hello world
结论
As @ Eng.Fouad注意到。问题是该方法是在接口中定义的默认方法
。 javac
似乎正在抓住这一点。
$ cat Java8i.java
$
public interface Java8i {
default void print(java.io.PrintStream out){
out.printf(hello world\\\
);
}
}
$ 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类路径未与-source配合使用1.7
Java7i .java:3:错误:找不到符号
new Java8c()。print(System.out);
^
symbol:method print(PrintStream)
location:class Java8c
1 error
1 warning
$ p>
javac
应该更有帮助地告诉我。 $ b解决方案
这是一个新的Time / Date API,在Java 8中引入。这就是为什么它不能用Java 7编译。 >
toInstant()
是一种默认方法,-source 1.7
不支持默认方法(Java 8的新功能)。I have the following class.
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); } }
It just compiles fine.
& javac ZonedDateTimeToInstant.java
And it fails with
-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
Is this normal? It seems that
javac
doesn't understand JDK classes with-source
other than1.8
.According to javac,
javac
still supports various-source release
options as previous releases did.Supplement
I already know the JSR 310: Date and Time API is only available in Java 8. What does it matter with
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
Conclusion
As @Eng.Fouad noted. The problem was that the method is a
default method
defined in an interface.javac
seems to be catching that point.$ 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
should've told me more helpfully.解决方案
This is a new Time/Date API which is introduced in Java 8. That's why it does not compile with Java 7.
toInstant()
is a default method, whereas-source 1.7
doesn't support default methods (Java 8's new feature).这篇关于JDK8 with -source 1.7 [默认方法]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!