Genrics WRRR Wildcards
xdm - 13-06-2006 01:12
Genrics WRRR Wildcards
Czy ktos wie gdzie jest sensownie objasnione korzystanie / tworzenie typow generycznych. Bo te opracowania ktore czytalem sa niesatyfakcjonujace. Wielu rzeczy nie rozumiem. Jestem zly na Generics bo ni jak nie umiem sobie wbic do glowy sposobu w jaki one dzialaja.
Type Erasure ok w sumie nawet fajnie brzmi i raczej to jest proste, proste dopoty dopoki nie korzystamy z o tego o tutaj : ?????
A teraz pare rzeczy ktorych nie kumam :
public class GenT7{
public static List<? super Number>test(){ return null; }
public static <E extends Number> List<? extends E> process(List<E> nums){ return null; } public static void main(String[] args) {
List<Number> input = null; List<? super Integer> output=null; List<? super Integer> a = null; a=output;
Object b =a.get(0); output=test(); output=process(input);
//Nie kapuje tego dlaczego output=process(input) nie przchodzi // przez kompilator ( tzn wyrzuca bład) // Zas test przechodzi przeciez obie funkcje zwracaja dokladnie // ten sam typ
}
}
Dobra powiecie pewnie ze powinienem był napisać w funkcji zamiast List<? extends E> List<? super E> dobra zgadzam sie powinienem byl tak napisac tylko co mi to da Czyli ze deklarujemy funkcje tak :
public static <E extends Number> List<? super E> process(List<E> nums)
Kiedy wtedy moge zwracac jedynie obiekty typu List<? super Integer> i List<? super Number>
a na liscie wywolac jedynie metodę np
Object obj; obj=a.get(0);
albo
List<? super Integer> lista=null; lista=process(input); Nie moge zwrocic zadnego typu oprocz tego czegoś : " <capture-of ? super Number>"
Wydawalo mi sie ze nie ma problemu zeby zrobic cos takiego
List<Number> lista=null; lista = process(input);
Ale to jest dla kompilatora ogromny problem
List<Integer> wej ; List<Integer> wyj ;
wyj=process(wej);
To dla kompilatora tez stanowi taki sam problem
Do takich tekstow sklonilo mnie pytanie 16. Z z ksiazki K.Sierra B.Bates przygotowujacej do SCJP
cytuje ------------------------------------------CYTAT------------------------------------------------------- Given a method declared as: public static <E extends Number> List<? super E> process(List<E> nums) A programmer wants to use this method like this: // INSERT DECLARATIONS HERE output = process(input); Which pairs of declarations could be placed at // INSERT DECLARATIONS HERE to allow the code to compile? (Choose all that apply.) A. ArrayList<Integer> input = null; ArrayList<Integer> output = null; B. ArrayList<Integer> input = null; List<Integer> output = null; C. ArrayList<Integer> input = null; List<Number> output = null; D. List<Number> input = null; ArrayList<Integer> output = null; E. List<Number> input = null; List<Number> output = null; F. List<Integer> input = null; List<Integer> output = null; G. None of the above. Answer: 3 B, E, and F are correct. The return type of process is definitely declared as a List, not an ArrayList, so A and D are wrong. C is wrong because the return type evaluates to List<Integer>, and that can't be assigned to a variable of type List<Number>. Of course all these would probably cause a NullPointerException since the variables are still null---but the question only asked us to get the code to compile. -----------------------------------koniecCYTATU-------------------------------------------------------
Gdzie wlasnie odpowiedzi B,E,F podaje sie za dobre ( kompilator mowi ze sa zle). W takim razie pytam skoro wyszlo na to ze moge zwrocic jedynie capture of ? super E i to dokladnie to po co mi w ogole jakies '?'. Wolalbym w takim razie korzystac z samych "bounded generics" po co te Wildcards kiedy to wprowadza tyle zamieszania. Nie przeczytalem jeszcze zadnego dokumentu ktory by precyzyjnie wyjasnial istote Wildcards. Najwartosciowszym prawdopodobnie jest :
http://www.angelikalanger.com/Generi...nericsFAQ.html
Ale przesady czytac 450 stron zeby zrozumiec co daje jeden znaczek ? . Musi byc jakis bardziej odpowiedni sposob.
Rozczarowany Genericsami .... xdm
PS:Dzieki z gory kazdemu kto postara mi sie naswietlic w jakichs paru punktach sens istnienia Wildcards.
=?ISO-8859-2?Q?Pawe=B3_W=F3jciak?= - 13-06-2006 01:13
xdm napisał(a): > Czy ktos wie gdzie jest sensownie objasnione korzystanie / tworzenie > typow generycznych. Bo te opracowania ktore czytalem sa > niesatyfakcjonujace. Wielu rzeczy nie rozumiem. Jestem zly na Generics > bo ni jak nie umiem sobie wbic do glowy sposobu w jaki one dzialaja. > <snip>
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
tutaj masz wszystko ładnie opisane, na jedynych 23 stronach ;)
Pozdrawiam, Pablo
a1 - 13-06-2006 01:13
xdm wrote:
<ciah>
> > List<? super Integer> lista=null; > lista=process(input); > Nie moge zwrocic zadnego typu oprocz tego czegoś : " <capture-of ? > super Number>"
process zwraca ci w tym wypadku List<? extends Number>, i chcesz to przypisac do List<? super Integer>, zauwaz ze List<? extends Number> ma wildcard duzo szerszy niz List<? super Integer> wiec sa to rozne typy i nie ma mozliowsci ich przypisacnia.
-- a1 (Bartek Janusz) arcone1 gmail com
xdm - 13-06-2006 01:13
a1 napisał(a): > xdm wrote: > > <ciah> > >> >> List<? super Integer> lista=null; >> lista=process(input); >> Nie moge zwrocic zadnego typu oprocz tego czegoś : " <capture-of ? >> super Number>" > > process zwraca ci w tym wypadku List<? extends Number>, i chcesz to > przypisac do List<? super Integer>, zauwaz ze List<? extends Number> ma > wildcard duzo szerszy niz List<? super Integer> wiec sa to rozne typy i > nie ma mozliowsci ich przypisacnia. >
W srodkowej czesci posta bys zauwazyl ze w miedzyczasie sie wycofalem z extends :) ale juz nie chcialo mi sie wymazywac. i deklaracja ktora odnosi sie do tego pytania brzmi: public static <E extends Number> List<? super E> process(List<E> nums)
A jeszcze ciekawsze jest pytanie ktore cytuje i w ktorym sie podaje bledne odpowiedzi za prawdziwe.
a1 - 13-06-2006 01:13
xdm wrote:
>> process zwraca ci w tym wypadku List<? extends Number>, i chcesz to >> przypisac do List<? super Integer>, zauwaz ze List<? extends Number> >> ma wildcard duzo szerszy niz List<? super Integer> wiec sa to rozne >> typy i nie ma mozliowsci ich przypisacnia.
faktycznie troche chaotycznie piszesz, w kazdym razie:
<code> public <E extends Number> List<? super E> process(List<E> nums){ return null; }
public void testProcess() { List<Number> input = null; List<? super Integer> output=null;
List<Integer> in; List<Integer> out;
// to jest oczywiscie prawidlowe, i nie wiem czym to kompilujesz // ze ci sie wywala // List<? super Number> moze byc przypisane do // List<? super Integer> output=process(input);
// to jest nieprawidlowe bo process zwraca typ wildcardowany // (List<? super Integer> a probujesz go przyisac do typu // dobrze okreslonego (List<Integer> out=process(in) } </code>
-- a1 (Bartek Janusz) arcone1 gmail com
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[PostgreSQL] =?ISO-8859-2?Q?Du=BFa?= baza danych
[Oracle] Sesja uzytkownika
[mysql] roznica czasu
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
skladanie zdjecia ze zdjec
procedura tworzaca tabele - oracle
[pl/sql] =?ISO-8859-2?Q?po=B3=B1czy=E6_kilka_rekord=F3w?=
[MySQL] Zapisanie relacji
MacroBase
szukam projektanta strony www
zanotowane.pldoc.pisz.plpdf.pisz.plsulimczyk.pev.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|