[Java] Interface met wildcard generics implementeren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 31-08 07:30
Het is alweer even geleden dat ik met Java bezig was (en generics in het bijzonder), en kom nu niet meer uit het volgende vraagstuk. Googlen levert me niets op, wellicht dat enkelen onder u mij kunnen helpen :)

Ik heb deze interface gedefiniëerd:
Java:
1
2
3
4
public interface FeatureMap {
    /* ..... */
    public Map<Date, List<? extends Number>> getFeatures();
}


Nu dacht ik dat ik die zo zou moeten kunnen implementeren:

[code=java]
class Blabla implements FeatureMap {
/* ..... */

private Map<Date, List<Integer>> features = new TreeMap<>();

@Override
public Map<Date, List<Integer>> getFeatures() {
return features;
}

}[/code=java]

maar dat werkt niet, ik krijg de melding dat de return type van de implementerende methode niet compatibel is met die van de interface-specificatie. Het werkt ook niet als ik in de method signature van de implementatie het return type verander naar Map<Date, List<? extends Number>>, want dan is het type van features niet juist.

Alvast hartelijk dank!



Edit: hmm, de wildcard-implementatie werkt niet, maar als ik de interface verander naar:
Java:
1
2
3
4
public interface FeatureMap {
    /* ..... */
    public <T extends Number> Map<Date, List<T>> getFeatures();
}


werkt het wel (zonder verandering aan de implementerende klasse zoals hierboven). Ik dacht echter dat wildcards (dus de '?'-syntax) precies voor dit doel waren, en generics niet. Ergo: ik snap er nog steeds niks van :) Kan iemand me het precieze verschil uitleggen misschien?

[ Voor 19% gewijzigd door Eelke Spaak op 31-07-2012 13:54 ]

TheStreme - Share anything with anyone


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Die wel werkende versie is een Map<Date, ? extends List<? extends Number>>.

Het verschil is dat je in een Map<Date, List<Integer>> natuurlijk geen List<Long> kan stoppen. In een Map<Data, List<? extends Number>> zou dat wel moeten kunnen. Vandaar dat java de toewijzing niet toestaat, en je hier de functie als Map<Date, ? extends List<? extends Number>> moet declareren.

Zie verder bijv. http://stackoverflow.com/...-extends-mapstring-string

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten