9 Stimmen

JDK8 mit -Quelle 1.7 [Standardmethoden]

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.

12voto

Eng.Fouad Punkte 110730

Dies ist eine neue Time/Date-API, die in Java 8 eingeführt wird. Deshalb lässt sie sich nicht mit Java 7 kompilieren.

toInstant() ist eine Standardmethode, während -source 1.7 Standardmethoden nicht unterstützt (eine neue Funktion von Java 8).

3voto

Vicente Romero Punkte 1442

Dies wurde aufgrund eines Fehlers in javac erstellt. Zugehörige Fehler sind: JDK-8029240 und JDK-8030855. Beide Probleme sind bereits behoben. Wenn Sie eine aktuelle Version von JDK8 erhalten oder die letzte Compiler-Version von langtools Entwicklungs-Repository klonen, sollten Sie in der Lage sein, Ihren Code zu kompilieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X