Filip Larsen wrote:
>
http://developer.java.sun.com/developer/technicalArticles/releases/generics/
>> Dog kan jeg ikke forstå at man stadigvæk bliver nødt til at caste:
<snip-snap>
> Det er man så vidt jeg kan se heller ikke. I eksemplet har de sikkert
> inkluderet en String cast i linie 41 for ikke at få "endnu en" kompilerfejl
> (hvis programstumpen ellers kunne kompileres ville der her komme en
> ClassCastException under kørsel da listIterator.next() returnerer værdier af
> typen Integer).
Ja, det ved jeg godt, men hvorfor overhovedet prøve at få
Integer-elementer smidt ind i en String-variabel? Jeg ved godt at man
kan, men jeg synes i så fald at eksemplet forvirrer mere end det gavner.
> Variablen listIterator er defineret i linie 22 som værende af typen
> Iterator<Integer>, og jeg vil vædde på, at Iterator<Element>.next() er
> defineret med returtypen Element således, at der ikke skal bruge en cast for
> normal brug af next().
Den er jeg med på. Det lyder faktisk rigtig smart!
Jeg var nødt til, på et projekt vi lige har afleveret på min uddannelse,
at caste elementer fra en List til Object, derefter finde ud af hvilken
class de var ( if ((Object)v.get(i)).getClass().equals(Klasse.class))i[1],
caste dem til "Klasse" og derefter køre den ønskede operation på dem.
Det bliver "sjovt" at skulle forsvare dén til eksamen :P
[1] Den "rigtige" kode er:
for (int i = 0; i < elements.size();i++)
// elements kan indeholde både AMat, BMat, og Materiale-objekter.
{
Object obj = (Object)elements.get(i);
if (obj.getClass().equals(AMat.class))
{
if ( ((AMat)obj).getMinLager() >= 17)
...stuff...
}
else if (obj.getClass().equals(BMat.class))
{
...other stuff...
}
else
{
...yet more stuff...
}
}
Men det virker!
--
..signature