JDK8 with-source 1.7 [методы по умолчанию]

у меня есть следующий класс.

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 не понимает классы JDK с -source кроме 1.8.

по данным javac и, javac по-прежнему поддерживает различные -source release параметры, как и в предыдущих выпусках.

дополнение

я уже знаю the JSR 310: дата и время API доступно только в Java 8. Какая разница с javac?

$ cat Java8.java
public class Java8 {
    public void print(java.io.PrintStream out) {
        out.printf("hello worldn");
    }
}
$ 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

вывод

As @Eng.Фуад отметил. Проблема заключалась в том, что метод является default method определена в интерфейсе. javac кажется, улавливает этот момент.

$ cat Java8i.java
public interface Java8i {
    default void print(java.io.PrintStream out) {
        out.printf("hello worldn");
    }
}
$ 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 надо было сказать мне более услужливо.

2 ответов


Это новый API времени / даты, который представлен в Java 8. Вот почему он не компилируется с Java 7.

toInstant() является методом по умолчанию, тогда как -source 1.7 не поддерживает методы по умолчанию (новая функция Java 8).


Это было произведено из-за ошибки компилятора javac. Связанные ошибки: JDK-8029240 и JDK-8030855. Обе проблемы уже исправлены. Если вы получаете последнюю версию JDK8 или клонируете последнюю версию компилятора из langtools dev repo, вы должны быть в состоянии скомпилировать ваш код.