[Java] Warum kein Kompilierungsfehler für Klassen auftritt, die Comparable nicht implementieren

Bei der Behandlung einer Klasse, die Comparable with TreeSet usw. nicht implementiert, ist die Spezifikation so, dass anstelle eines Kompilierungsfehlers ein Laufzeitfehler (ClassCastException) ausgelöst wird. Es wird angenommen, dass dies eine Szene voraussetzt, in der die übergeordnete Klasse die Comparable-Schnittstelle nicht implementiert und die untergeordnete Klasse die Comparable implementiert, wenn Generika verwendet werden.

Beispiel

Die übergeordnete Musician-Klasse implementiert Comaparable nicht, die untergeordnete Klasse jedoch.


class Musician {

    public enum Category {
        ROCK, JAZZ, CLASSIC
    }

    public String getName() {
        return name;
    }

    public Category getCategory() {
        return category;
    }

    private String name;
    private Category category;

    Musician(String name, Category category) {
        this.name = name;
        this.category = category;
    }
}

class ChildMusician extends Musician implements Comparable {

    ChildMusician() {
        super("", null);
    }

    @Override
    public int compareTo(Object o) {
        return 0;
    }
}

Lauf


Set<Musician> musicianSet = new TreeSet<>();
musicianSet.add(new ChildMusician());

Wenn keine untergeordnete Klasse vorhanden ist, ist es effizienter, in der ersten Zeile einen Kompilierungsfehler auszugeben. Da jedoch möglicherweise untergeordnete Klassen vorhanden sind, wird die Umwandlung zur Laufzeit überprüft.

Recommended Posts

[Java] Warum kein Kompilierungsfehler für Klassen auftritt, die Comparable nicht implementieren
Schienen <% = Ausdruck%> Warum im leeren Zustand kein Fehler auftritt
[Java] Erläutert die ConcurrentModificationException, die in java.util.ArrayList für Neulinge auftritt
Unerwartet unbekannte Java-Zusammenfassung für reservierte Wörter