[Javalist] instanceof subtype probléma

Peter Verhas peter at verhas.com
2013. Feb. 15., P, 11:58:02 CET


deszkamodellnek, elindulásnak valami ilyesmi:

		for (Object object : objects) {
			Type ty = predicate.getClass().getGenericInterfaces()[0];
			ParameterizedType pty = (ParameterizedType) ty;
			Class clazz = (Class) pty.getActualTypeArguments()[0];
			if (clazz.isInstance(object)) {
				T t = (T) object;
				predicate.match(t);
			}
		}

Persze ez csak akkor működik ha direktben van az implementációba odaírva, hogy implements Predicate<XXX> és nem annak valami sub interfészét implementálja, vagy az interfészt implementáló osztályt extendál, és nem implementál más interfészt az aktuális predicate, hanem csak ezt az egyet, különben nem a [0] index lesz a jó. Ha éles környezetben kell, akkor végig kell mászni reflection-nel az öröklődési fán, megkeresni belőle a megfelelő saját interfészt, mint ParametrizedType-ot és megnézni, hogy ott milyen Class jön vissza a T helyéről.

Na ez pont az, amit implementáltak neked a JVM-ben, sokkal valószínűbb, hogy kevesebb hibával, mint ahogy te implementálnád.

Szerintem kapd el azt a kurva kivételt. Jobb, mint az aids.

--
Verhás Péter
peter at verhas.com
+36(30)9306805
skype: verhas




On 2013.02.15., at 11:17, <istvan.ketler at lhsystems.com> wrote:

> Szia,
> 
> nem értem, miért nem opció hogy elfogod a ClassCastException-t és feldolgozod?
> Hiszen ha előtte ellenőrzöl, akkor is csak nagyjából az történik, hogy észreveszed hogy nem jó. Max performace spórolás hogy nem generál stacktrace-t?
> 
> Az nem igaz, hogy minden információ ott van már. Ugye a T már nincs futásidőben, viszont esetleg a Predicate<T> interfésznek lehet egy 
> 
> boolean isInstance(Object obj);
> 
> vagy
> 
> boolean isAcceptableForMatch(Object obj);
> 
> metódusa, amely megmondhatja hogy tud-e majd castolni. Persze ez függ attól hogy miként akartad implementálni, de nekem úgy tűnik hogy nem tudod megúszni azt hogy valahogy odaadd a class-t.
> 
> Esetleg próbálkozhatsz a Class getGenericInterfaces és hasonló metódusaival, meg a Type, ParametrizedType interfészekkel, de ilyet soha nem csináltam, nem tudom mit lehet és mit nem. Igazából azt sem tudom mire jók, mert mintha a T-t adná vissza, nem pedig a tényleges futásidejű class-t, a T-vel pedig asszem nem sokra megy az ember. Majd egyszer ha lesz időm rá eljátszom vele.
> 
> Üdv
> 
> Iván
> 
> ______________________________
> István Ketler
> Senior Consultant
> 
> Lufthansa Systems Hungária Kft.
> Development Center Pest
> Neumann János u. 1/e
> 1117 Budapest
> Hungary
> Phone: +36 1 887-2815
> Fax: +36 1 887-0577
> Mobile: +36 30 600-4936
> E-mail: istvan.ketler at LHsystems.com
> www.LHsystems.com
> 
> -----Original Message-----
> From: javalist-bounces at lists.javaforum.hu [mailto:javalist-bounces at lists.javaforum.hu] On Behalf Of Keresztes Jozsef
> Sent: Friday, February 15, 2013 9:58 AM
> To: javalist at lists.javaforum.hu
> Subject: [Javalist] instanceof subtype probléma
> 
> Sziasztok !
> 
> A problémám a következő: 
> Van egy interface-em:
> 
> public interface Predicate<T> {
>  public boolean match(T candidate);
> }
> 
> És egy másik oszály query() metódusa pedig vár egy ilyen Predicate objektumot.
> 
> public <T> List<T> query(Predicate<T> predicate) {
>  for (Object object: objects) {
>    T t = (T)object;              // itt nincs hiba
>    predicate.match(t);    // itt ClassCastException jöhet
>  }
>  ...
> }
> 
> Ebben a másik osztályban van egy rakás Object, és szeretném meghívni a Predicate match() metódusát, de csak azokkal az objektumokkal amelyek megfelelnek T-nek !
> Persze rögtön az instanceof-ra gondolunk de azt nem lehet használni a subtype-ra.
> Ráadásul a "T t = (T)object;" sem ad hibát még futásidőben sem pedig az objektum nem felel meg T-nek.
> A futásidejű  ClassCastException csak akkor jön ha a match() meghívódik.
> Szóval hogy lehetne megvizsgálni hogy egy objektum megfelel-e T típusnak és már a match()-nek át se adjam ? 
> A primítív megoldás az lehet hogy igenis minden objektumot átadok a match()-nek és lekezelem egy try-blokkban a ClassCastException-t. Nincs jobb ?
> 
> Joe
> 
> 
> 
> 
> _______________________________________________
> Javalist mailing list
> Javalist at lists.javaforum.hu
> http://lists.javaforum.hu/mailman/listinfo/javalist
> _______________________________________________
> Javalist mailing list
> Javalist at lists.javaforum.hu
> http://lists.javaforum.hu/mailman/listinfo/javalist

--------- következő rész ---------
Egy csatolt HTML állomány át lett konvertálva...
URL: <http://lists.javaforum.hu/pipermail/javalist/attachments/20130215/cc76e284/attachment.html>


További információk a(z) Javalist levelezőlistáról