Ich habe eine Basis BusinessObject abstrakte Klasse, die vergleichbare durch Vergleich ihrer langen ID Felder implementiert. Stellen Sie sich vor, ich verlängere es mit, sagen wir, Person und dann erweitere ich Person mit Worker. So haben wir:Java Vergleichbare Vererbung
Businessobject < Person < Worker
So, jetzt außer Kraft gesetzt ich die compareTo (Businessobject) in Business-Objekt in Person (vergleiche die Namen) und Arbeiter (vergleicht die Jobnamen, dann Person Namen).
jetzt etwas tun, wie ich:
List<BusinessObject> collection = new ArrayList<>();
collection.add(new Worker(1L, "Steve", "janitor"));
collection.add(new Worker(2L, "Mark", "plumber"));
collection.add(new Person(3L, "Dave"));
Collections.sort(collection);
System.out.println(collection);
Durch die Protokollierung kann ich die Anrufe sehen, die gemacht werden:
- Worker.compareTo()
- Person.compareTo()
Also bedeutet es Sortiermethoden gemischt, die offensichtlich nicht gut ist. Also, was ist der richtige Weg, mit Vererbung Vergleichbar zu implementieren, so dass das Verfahren auf der gattungsgemäßen Art der Sammlung genannt abhängt:
- wenn Kollektion ist eine Liste dann immer BusinessObject.compareTo() verwendet
- wenn Sammlung eine Liste dann verwenden Sie immer Person.compareTo()
- wenn Sammlung eine Liste ist dann immer Worker.compareTo verwenden()
Hier ist mein Code:
public abstract class BusinessObject implements HasId, HasText, Comparable<BusinessObject> {
protected @Nullable Long id;
public BusinessObject(@Nullable Long id) {
this.id = id;
}
@Override
public @Nullable Long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Override
public int compareTo(@NonNull BusinessObject o) {
System.out.println("compareTo BusinessObject");
return Long.compare(id, o.id);
}
@Override
public String toString() {
return String.format("BusinessObject#%d", id);
}
}
public class Person extends BusinessObject {
protected final String name;
public Person(@Nullable Long id, String name) {
super(id);
this.name = name;
}
@NonNull
@Override
public String getText(Context context) {
return null;
}
@Override
public String toString() {
return String.format("Person#%d (%s)", id, name);
}
@Override
public int compareTo(@NonNull BusinessObject o) {
if (o instanceof Person) {
System.out.println("compareTo Person");
Person po = (Person) o;
return name.compareTo(po.name);
}
else {
return super.compareTo(o);
}
}
}
public class Worker extends Person {
protected final String job;
public Worker(@Nullable Long id, String name, String job) {
super(id, name);
this.job = job;
}
@Override
public String toString() {
return String.format("Worker#%d (%s-%s)", id, name, job);
}
@Override
public int compareTo(@NonNull BusinessObject o) {
if (o instanceof Worker) {
System.out.println("compareTo Worker");
Worker wo = (Worker) o;
return String.format("%s%s", name, job).compareTo(String.format("%s%s", wo.name, wo.job));
}
else {
return super.compareTo(o);
}
}
}
Bitte fügen Sie Ihre Person und Code-Worker – solomkinmv
Der offensichtliche Weg ist nicht zwei verschiedene Arten von Objekten in einer einzigen Liste zu mischen. Wenn Sie sie mischen, sind Sie verpflichtet, diese Art von Ergebnissen zu bekommen, wie Sie Äpfel und Apfelsaft vergleichen. –
Bitte klären Sie, wenn Sammlung ist eine Liste dann verwenden Sie immer BusinessObject.compareTo() Wenn Sammlung ist eine Liste dann immer verwenden Sie Person.compareTo() Wenn Sammlung ist eine Liste dann immer verwenden Worker.compareTo() ". – htpvl