Erweiterte Java Generics Frage: Warum brauchen wir redundante Informationen angeben

StackOverflow https://stackoverflow.com/questions/252775

  •  05-07-2019
  •  | 
  •  

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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top