Når compileren ikke tillader det, så er det nok ikke muligt at gøre så meget ved det.
Årsagen skyldes at begge constructore - undervejs i kompileringen - reduceres til:
MyClass(ArrayList z) { }
Dvs. at de har det samme "erasure".
Problemet er i øvrigt ikke specifikt for constructore - f.eks. får du akurat samme fejlbesked med:
public void demo(ArrayList<X> x) { }
public void demo(ArrayList<Y> y) { }
Da fejlen altså skyldes at begge funktionere reduceres til identiske funktions-signature, kunne en mulig workaround være at ændre på den overordnede signatur:
Flg. virker: public <T> void method(T x) { ... } public <T extends String> void method(T y) { ... }
Men flg. virker ikke: public <T extends ArrayList<String>> method(T s) { ... }
public <T extends List<Integer>> method(T i) { ... }
Der er vel umiddelbart (ikke gennemtænkt!) en slags modstrid i, at man med generics netop specificerer/indsnævrer over for compileren på compile-time, hvad man ønsker, men at man omvendt ikke kan lave simpel overload som ovenfor, hvor man jo netop gør "en dyd ud af" at understrege forskellen mellem metoderne.
Problemet er ikke så stort ved metoder, idet man helt banalt kan give metoderne forskellige navne demoX() og demoY(). Med constructors er navnet jo givet, så her er det lidt vanskeligere. At tilføje en ekstra parameter virker jo, men er ikke pænt. En variant kunne måske være noget med at erstatte constructors af static metoder, der returnerer et objekt af klassen, og disse metoder kan man så give forskellige navne, altså:
public <T extends ArrayList<String>> method(T s) { }
public <T extends List<Integer>> method(T i) { }
- er at <T extends ArrayList<String>> og <T extends List<Integer>> slet ikek fungere som returtyper i det givne tilfælde - de er derimod en del af den overordnenede syntaks. Derfor fejler kompileringen af den simple grund at dine metoder ikke har nogen retur-type.
->nielle: Nej, du misforstår mig, fordi jeg skrev noget vrøvl (havde constructors i tankerne, dvs. ingen returtype og skrev også List i st. f. ArrayList).
Ok, men jeg var bare ikke sikker på at du havde fået svar på alle dine spørgsmål...
Svar :^)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.