Sziasztok,
az adott kódban szeretném az ismeretlen típusát lekérdezni, kiírni a képernyőre.
public static <S> S kornyezet(){
S obj = null;
/*...*/
return obj;
}
Mit javasoltok?
SZERKESZTVE:
static{
Float f = miez();
Integer i = miez();
Color c = miez();
}
static <S> S miez(){
System.out.println(S.class);
return null;
}
hiba: Illegal class literal for the type parameter S
- 1551 megtekintés
Hozzászólások
Nem értem a kérdést.
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
bocs, tényleg nehéz megfogalmazni. A kódban valami S szimbólum jelzi, hogy mivel kell visszatérnie, illetve hogy mit vár a környezete - ha jól értem. ennek a típusára vagyok kíváncsi.
azt szeretném, ha mondjuk a következő kód
Color c = kornyezet();
Integer i = kornyezet();
Map m = kornyezet();
kimenete rendre
Color
Integer
Map
lenne.
megoldható?
- A hozzászóláshoz be kell jelentkezni
Meg. :)
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
szuper!
- A hozzászóláshoz be kell jelentkezni
google this: Reflection
obj.getClass().getName()
vagy
S.class.getName()
returns String
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
NullPointerException ;-)
- A hozzászóláshoz be kell jelentkezni
ja, ha az obj == null, akkor persze :)
próbáld a másodikat.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
a másodikra meg:
Illegal class literal for the type parameter S
- A hozzászóláshoz be kell jelentkezni
A /*...*/ sor helyett milyen sorok vannak?
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
Egyelőre semmi.
Ott szeretném S típusát kiiratni.
Tehát arra kell rájönni, hogy mi legyen a megjegyzés helyén.
- A hozzászóláshoz be kell jelentkezni
Figy, lehet hülye vagyok, de. Mi lenne, ha nem paraméter nélküli lenne a metódusod, hanem kapna egy Class típusú bemeneti paramétert. És akkor úgy hívnák meg, hogy környezet(S.getClass()). És innentől tudod. A metódustörzs nem tud az S-ről, mivel az vísszatérési típus. Viszont nyilván, ha nem megfelelő dologgal fogsz visszatérni, akkor úgyis hibát dob majd.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
köszönöm a válaszod, így teszek majd.
- A hozzászóláshoz be kell jelentkezni
es ezt mire akarod hasznalni?
- A hozzászóláshoz be kell jelentkezni
tekintve, hogy S a metoduson belul jon letre, nem tudod lekerdezni, hogy milyen tipussal szeretne hogy visszaterjen
- A hozzászóláshoz be kell jelentkezni
miért a metóduson belül?
- A hozzászóláshoz be kell jelentkezni
akkor mashogy foglmazva: a metoduson belul szeretned megtudni, hogy amivel visszatersz az milyen tipus kell legyen
es ezt IMHO nem tudod lekerdezni - fuggetlenul attol, hogy az adott metoduson belul jon letre az az objektum, vagy egy mar letezo instance-t adsz vissza.
- A hozzászóláshoz be kell jelentkezni
Konkrétan meg szeretném tudni, hogy a környezete mit vár el az eljárásomtól, hogy az annak leginkább megfelelő osztály példányával térhessen vissza. Sok fölösleges paraméterezést megspórolhatnánk így.
- A hozzászóláshoz be kell jelentkezni
Kis segítség: az obj megvan a példányosodott, nem? Miért nem kérdezed le abból? :)
--
http://wiki.javaforum.hu/display/FREEBSD
- A hozzászóláshoz be kell jelentkezni
ejj, látom, hogy ez az obj nagyon bekavar.. nincs példányosítva, az egész statikus, az obj=null. engem pedig S osztályának a neve érdekel még mindig. :)
- A hozzászóláshoz be kell jelentkezni
de a generics nem runtime dolog
- A hozzászóláshoz be kell jelentkezni
és ez megtiltja, hogy ismerjem a várt visszatérési érték típusát? nem értem.
- A hozzászóláshoz be kell jelentkezni
az obj referencia - amit visszaadsz - típusa az S parametrizált típus.
public static <S> S kornyezet() {
S obj = null;
for (Method m : Valami.class.getDeclaredMethods()) {
if ("kornyezet".equals(m.getName())) {
System.out.println(m.getGenericReturnType());
}
}
return obj;
}
At fogod látni hogy "S"... mert az a típusa.
- A hozzászóláshoz be kell jelentkezni
Sajna igen, mert a null az null.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
Például
public static <S> S doSomething() {
S obj = null;
obj = (S)new ArrayList();
System.out.println(obj.getClass().getName());
return obj;
}
És kiírja hogy java.util.ArrayList... hol tart már a tudomány..
Ez valami SCJP mitírkileforduledobehibát kérdés?
- A hozzászóláshoz be kell jelentkezni
És kiírja hogy java.util.ArrayList... hol tart már a tudomány..
ööö.. khm..
Ez valami SCJP mitírkileforduledobehibát kérdés?
nem, saját.
- A hozzászóláshoz be kell jelentkezni
Khm, type erasure?
----------------------
while (!sleep) sheep++;
- A hozzászóláshoz be kell jelentkezni
kifejtenéd bővebben?
- A hozzászóláshoz be kell jelentkezni
google.
a genericeket ugy implementaltak, hogy forditaskor van tipusellenorzes, azonban utana minden tipus torlodik [mindezt azert, hogy visszafele kompatibilis maradjon a generalt bytecode].
itt az altalad ahitott kod, csak nem az altalad ahitott kimenettel :-)
final class X<T> {
private final List<T> x;
public X() {
x = null;
}
public void printType() {
for(Field f : this.getClass().getDeclaredFields())
System.out.println(((ParameterizedType)f.getGenericType()).getActualTypeArguments());
}
}
public class Main {
public static <S> S kornyezet() {
X<S> p = new X<S>();
p.printType();
return null;
}
}
- A hozzászóláshoz be kell jelentkezni
meglepő. kösz.
- A hozzászóláshoz be kell jelentkezni
??? Hát én kipróbáltam. Kiírja egy tömb azonosítóját. A tömbben meg van egy elem (egy Type), az meg egyszerűen Integer helyett(azt példányodítottam) T.
Futásidőben sehogy nem lehet lekérdezni egy generic valós típusát (kiveve ha mar van benne elem, de az gany.).
Vagy akkor nem értem.
De pl. a kornyezet fv. visszateresi erteke is rejtely.
Lecci ha mar kinyilatkoztatsz, akkor vesd kozenk hatalmas tudasod morzsait is...
:-)
- A hozzászóláshoz be kell jelentkezni
nem tudasmorzsakrol van itt szo, csak napi sokoraban javazok, igy sokmindenbe belefutottam mar. de most Nalad a pont.
a tortenet (itt lehet ugrani ha vkit nemerdekel a magyarazkodas:P) az, hogy szuksegem lett volna nekemis erre (pontosabban en a tipusparametert szerettem volna peldanyositani..), es nem is talaltam ra megoldast, termeszetesen a futas kozbeni tipusparametereket a type erasure elnyeli (igy fent is).
viszont _nem_ mindent nyel el, amit lent irtam, hogy ki lehet nyerni a generikus tipust tovabbra is tartom, hiszen a tipusdeklaracio resze lesz.
public class Main {
private List<Integer> i;
public static void main(String[] args) {
for(Field f : Main.class.getDeclaredFields()) {
System.out.println(((ParameterizedType)f.getGenericType()).getActualTypeArguments()[0]);
}
}
}
- A hozzászóláshoz be kell jelentkezni
Köszi, ez már tényleg működik. Akkor az van, hogy ha deklaráció szinten meg van adva akkor kinyerhető, ha meg paraméteres, és csak futásidőben dől el, akkor nem?
Mondjuk fura. Már nekem is kellett volna ...
- A hozzászóláshoz be kell jelentkezni
Annyit tudsz, amit a compiler tud. :)
----------------------
while (!sleep) sheep++;
- A hozzászóláshoz be kell jelentkezni
En nem vagyok Java programozo, igy csak nagyon valoszinusitem, hogy ez okozza a problemat. :)
----------------------
while (!sleep) sheep++;
- A hozzászóláshoz be kell jelentkezni
Futasidoben nem lehet lekerdezni a tipusparameter tipusat (nincs "reification").
Nehany kovetkezmeny:
- egy T tipusparameterre nem ertelmezheto, hogy T.class
- nem hasznalhato az instanceof annak eldontesere, hogy egy objektum T tipusu-e
- nem hozhato letre egy T elemekbol allo tomb
- nem irhatok class literalok generikus tipusokra (List<String>.class)
- nem hasznalhato az instanceof annak eldontesre, hogy az objektum List<String> tipusu-e
- nem hozhato letre List<String> elemekbol allo tomb
- stb.
A 7-es Javaban volt szo a Reification megvalositasarol, de vegul kimaradt, mivel tul nagy teruletet erintett volna.
- A hozzászóláshoz be kell jelentkezni
+ buktad a boxing-mentes kontenereidet :)
----------------------
while (!sleep) sheep++;
- A hozzászóláshoz be kell jelentkezni
le lehet kerdezni, lasd a fenti kodot, egy List<Integer> -re tokeletesen fog mukodni. csak az nem mindig az, amit szeretne az ember.. :)
- A hozzászóláshoz be kell jelentkezni
Sziasztok,
köszönöm a gyors válaszaitokat. Sok érdekesség elhangzott, nagyon tanulságos volt. Azt hiszem, a kérdés megoldva.
Jó éjt,
zepp.
- A hozzászóláshoz be kell jelentkezni