Erweiterte Java Generics Frage: Warum brauchen wir redundante Informationen angeben
Frage
Ich habe einige generische Klasse für meinen PPV Modell POJO bekommt, das so geht:
public interface Identifiable<PK extends Serializable> {
PK getUniqueId();
}
public interface GenericDao<T extends Identifiable<PK>> {
public T findById(PK id);
}
Dieser Code wird nicht kompiliert. Damit dies funktioniert, muss ich angeben
public interface GenericDao<T extends Identifiable<PK>, PK extends Serializable>
Aber das ist redundante Information !! Die Tatsache, dass T erstreckt identifizierbares bedeutet, dass ein PK-Typ wird für die identifizierbare Instanz festgelegt werden und dass dies auf die Art der PK DAO zu verwenden.
Wie kann ich diese Arbeit ohne redundante Informationen machen?
Danke, Fred
Edit: Vereinfachtes Beispiel
Lösung
Haben Sie versucht:
public interface WatchableDao<T extends Watchable<?>>
(d. Es ist ein Watchable<Something>
aber ist mir egal, was Something
ist)
Ich habe es nicht ausprobiert, aber es ist ein Versuch wert.
EDIT: Beitrag Frage bearbeiten, wie es scheint, dass Sie tun müssen, PK als Typ-Parameter an die Schnittstelle wirklich. In diesem Fall glaube ich, müssen Sie effektiv die Einschränkung wiederholen, wie Sie tun. Ja, es ist überflüssig, aber ich denke, es ist einfacher als die Sprache angeben zu müssen, was wirksam Einschränkungen auf der Grundlage ihrer Verwendung als Typargument an anderer Stelle PK gelten würden. Wenn es ein Trost ist, das gleiche gilt in C #.
Es macht auch die Einschränkungen für PK klar aus nur die Schnittstelle selbst, anstatt an einer anderen Schnittstelle sehen zu müssen, um zu sehen, was machbar ist.