Ich habe die folgende Klasse.
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);
}
}
Es kompiliert einwandfrei.
& javac ZonedDateTimeToInstant.java
Und es schlägt mit -source 1.7
fehl.
& javac -source 1.7 ZonedDateTimeToInstant.java
ZonedDateTimeToInstant.java:10: Fehler: Symbol kann nicht gefunden werden
final Instant instant = now.toInstant();
^
Symbol: Methode toInstant()
Ort: Variable now vom Typ ZonedDateTime
1 Fehler
1 Warnung
Ist das normal? Es scheint, dass javac
JDK-Klassen mit -source
außer 1.8
nicht versteht.
Laut javac unterstützt javac
immer noch verschiedene -source release
Optionen wie frühere Versionen.
Zusatz
Ich weiß bereits, dass die JSR 310: Date and Time API nur in Java 8 verfügbar ist. Was hat das mit javac
zu tun?
$ 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
Schlussfolgerung
Wie @Eng.Fouad bemerkt hat. Das Problem war, dass die Methode eine default Methode
ist, die in einem Interface definiert ist. javac
scheint diesen Punkt zu bemerken.
$ 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: Fehler: Symbol kann nicht gefunden werden
new Java8c().print(System.out);
^
Symbol: Methode print(PrintStream)
Ort: Klasse Java8c
1 Fehler
1 Warnung
javac
hätte mir hilfreicher antworten sollen.