<html><head><meta http-equiv="Content-Type" content="text/html charset=iso-8859-2"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">deszkamodellnek, elindulásnak valami ilyesmi:<div><br></div><div><div style="margin: 0px; font-size: 11px; font-family: Monaco; "><span class="Apple-tab-span" style="white-space:pre">                </span><span style="color: #931a68">for</span> (Object object : objects) {</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; "><span class="Apple-tab-span" style="white-space:pre">                        </span>Type ty = predicate.getClass().getGenericInterfaces()[0];</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; "><span class="Apple-tab-span" style="white-space:pre">                        </span>ParameterizedType pty = (ParameterizedType) ty;</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; "><span class="Apple-tab-span" style="white-space:pre">                        </span><span style="text-decoration: underline">Class</span> clazz = (<span style="text-decoration: underline">Class</span>) pty.getActualTypeArguments()[0];</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; "><span class="Apple-tab-span" style="white-space:pre">                        </span><span style="color: #931a68">if</span> (clazz.isInstance(object)) {</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; "><span class="Apple-tab-span" style="white-space:pre">                                </span>T t = <span style="text-decoration: underline">(T) object</span>;</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; "><span class="Apple-tab-span" style="white-space:pre">                                </span>predicate.match(t);</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; "><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div style="margin: 0px; font-size: 11px; font-family: Monaco; "><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div apple-content-edited="true">
<span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; border-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; border-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="font-family: Helvetica; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span style="font-family: Verdana; "><br></span></div><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Persze ez csak akkor működik ha direktben van az implementációba odaírva, hogy implements Predicate&lt;XXX&gt; é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.</div><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br></div><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">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.</div><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br></div><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Szerintem kapd el azt a kurva kivételt. Jobb, mint az aids.</div><div style="font-family: Helvetica; "><span style="font-family: Verdana; "><br></span></div><div style="font-family: Helvetica; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="color: rgb(136, 136, 136); ">--</span><span class="Apple-style-span" style="color: rgb(136, 136, 136); "><br></span><span class="Apple-style-span" style="color: rgb(136, 136, 136); ">Verhás Péter</span><span class="Apple-style-span" style="color: rgb(136, 136, 136); "><br></span><span class="Apple-style-span" style="color: rgb(136, 136, 136); "></span><span class="Apple-style-span" style="color: rgb(136, 136, 136); "><a href="mailto:peter@verhas.com">peter@verhas.com</a></span><span class="Apple-style-span" style="color: rgb(136, 136, 136); "><br></span><span class="Apple-style-span" style="color: rgb(136, 136, 136); ">+36(30)9306805</span><span class="Apple-style-span" style="color: rgb(136, 136, 136); "><br></span><span class="Apple-style-span" style="color: rgb(136, 136, 136); ">skype: verhas</span></div></span><br class="Apple-interchange-newline"></div></span><br class="Apple-interchange-newline"></span><br class="Apple-interchange-newline">
</div>
<br><div><div>On 2013.02.15., at 11:17, &lt;<a href="mailto:istvan.ketler@lhsystems.com">istvan.ketler@lhsystems.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Szia,<br><br>nem értem, miért nem opció hogy elfogod a ClassCastException-t és feldolgozod?<br>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?<br><br>Az nem igaz, hogy minden információ ott van már. Ugye a T már nincs futásidőben, viszont esetleg a Predicate&lt;T&gt; interfésznek lehet egy <br><br>boolean isInstance(Object obj);<br><br>vagy<br><br>boolean isAcceptableForMatch(Object obj);<br><br>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.<br><br>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.<br><br>Üdv<br><br>Iván<br><br>______________________________<br>István Ketler<br>Senior Consultant<br><br>Lufthansa Systems Hungária Kft.<br>Development Center Pest<br>Neumann János u. 1/e<br>1117 Budapest<br>Hungary<br>Phone: +36 1&nbsp;887-2815<br>Fax: +36 1&nbsp;887-0577<br>Mobile: +36 30&nbsp;600-4936<br>E-mail: <a href="mailto:istvan.ketler@LHsystems.com">istvan.ketler@LHsystems.com</a><br><a href="http://www.LHsystems.com">www.LHsystems.com</a><br><br>-----Original Message-----<br>From: javalist-bounces@lists.javaforum.hu [mailto:javalist-bounces@lists.javaforum.hu] On Behalf Of Keresztes Jozsef<br>Sent: Friday, February 15, 2013 9:58 AM<br>To: javalist@lists.javaforum.hu<br>Subject: [Javalist] instanceof subtype probléma<br><br>Sziasztok !<br><br>A problémám a következő: <br>Van egy interface-em:<br><br>public interface Predicate&lt;T&gt; {<br> &nbsp;public boolean match(T candidate);<br>}<br><br>És egy másik oszály query() metódusa pedig vár egy ilyen Predicate objektumot.<br><br>public &lt;T&gt; List&lt;T&gt; query(Predicate&lt;T&gt; predicate) {<br> &nbsp;for (Object object: objects) {<br> &nbsp;&nbsp;&nbsp;T t = (T)object; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// itt nincs hiba<br> &nbsp;&nbsp;&nbsp;predicate.match(t); &nbsp;&nbsp;&nbsp;// itt ClassCastException jöhet<br> &nbsp;}<br> &nbsp;...<br>}<br><br>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 !<br>Persze rögtön az instanceof-ra gondolunk de azt nem lehet használni a subtype-ra.<br>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.<br>A futásidejű &nbsp;ClassCastException csak akkor jön ha a match() meghívódik.<br>Szóval hogy lehetne megvizsgálni hogy egy objektum megfelel-e T típusnak és már a match()-nek át se adjam ? <br>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 ?<br><br>Joe<br><br><br><br><br>_______________________________________________<br>Javalist mailing list<br>Javalist@lists.javaforum.hu<br>http://lists.javaforum.hu/mailman/listinfo/javalist<br>_______________________________________________<br>Javalist mailing list<br>Javalist@lists.javaforum.hu<br>http://lists.javaforum.hu/mailman/listinfo/javalist<br></blockquote></div><br></div></body></html>