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

前端之家收集整理的这篇文章主要介绍了java – JDK8 with -source 1.7 [默认方法]前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下课
  1. public class ZonedDateTimeToInstant {
  2.  
  3. public static void main(final String[] args)
  4. throws NoSuchMethodException {
  5.  
  6. assert ChronoZonedDateTime.class.isAssignableFrom(ZonedDateTime.class);
  7. final Method toInstant
  8. = ChronoZonedDateTime.class.getMethod("toInstant");
  9.  
  10. final ZonedDateTime now = ZonedDateTime.now();
  11. final Instant instant = now.toInstant();
  12.  
  13. System.out.println(instant);
  14. }
  15. }

它只是编译罚款.

  1. & javac ZonedDateTimeToInstant.java

并且它与-source 1.7失败.

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

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

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

补充

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

  1. $cat Java8.java
  2. public class Java8 {
  3. public void print(java.io.PrintStream out) {
  4. out.printf("hello world\n");
  5. }
  6. }
  7. $javac Java8.java
  8. $cat Java7.java
  9. public class Java7 {
  10. public static void main(final String[] args) {
  11. new Java8().print(System.out);
  12. }
  13. }
  14. $javac -source 1.7 -target 1.7 Java7.java
  15. warning: [options] bootstrap class path not set in conjunction with -source 1.7
  16. 1 warning
  17. $java Java7
  18. hello world

结论

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

  1. $cat Java8i.java
  2. public interface Java8i {
  3. default void print(java.io.PrintStream out) {
  4. out.printf("hello world\n");
  5. }
  6. }
  7. $javac Java8i.java
  8. $cat Java8c.java
  9. public class Java8c implements Java8i {
  10. }
  11. $javac Java8c.java
  12. $cat Java7i.java
  13. public class Java7i {
  14. public static void main(final String[] args) {
  15. new Java8c().print(System.out);
  16. }
  17. }
  18. $javac -source 1.7 -target 1.7 Java7i.java
  19. warning: [options] bootstrap class path not set in conjunction with -source 1.7
  20. Java7i.java:3: error: cannot find symbol
  21. new Java8c().print(System.out);
  22. ^
  23. symbol: method print(PrintStream)
  24. location: class Java8c
  25. 1 error
  26. 1 warning

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

解决方法

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

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

猜你在找的Java相关文章