/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Parameteriserede typer kommer i 1.5
Fra : Ulrik Magnusson


Dato : 10-12-02 23:05

<http://developer.java.sun.com/developer/technicalArticles/releases/generics/>

og det må siges at være godt nyt Det store spørgsmål er så,
hvordan det skal implementeres - artikler der linkes til fra siden
siger både noget om "trampoline classes" og udvidelse af JVM'en
(altså ekstra instruktioner) - men i C++ er der jo ekspandering af
templates.. Nogen der ved, hvad de har tænkt sig? (der nævnes
jo desværre noget om en "performance penalty", men bliver det i
tid eller plads? Man havde jo måske forventet en forbedring i tid.)

Ulrik Magnusson


 
 
Christian Andersen (11-12-2002)
Kommentar
Fra : Christian Andersen


Dato : 11-12-02 07:39

Ulrik Magnusson wrote:

><http://developer.java.sun.com/developer/technicalArticles/releases/generics/>
>
> og det må siges at være godt nyt

Jeg vidste ikke hvad det var, men det lyder da som en god ting.

Dog kan jeg ikke forstå at man stadigvæk bliver nødt til at caste:

9. LinkedList<String> stringList = new LinkedList<String>();

[...]

40. while (listIterator.hasNext()) {
41. item = (String)listIterator.next();

Men hvad ved jeg?

--
..signature

Filip Larsen (11-12-2002)
Kommentar
Fra : Filip Larsen


Dato : 11-12-02 08:59

Christian Andersen skrev

>
http://developer.java.sun.com/developer/technicalArticles/releases/generics/
>
> ...
>
> Dog kan jeg ikke forstå at man stadigvæk bliver nødt til at caste:
>
> 9. LinkedList<String> stringList = new LinkedList<String>();
>
> [...]
>
> 40. while (listIterator.hasNext()) {
> 41. item = (String)listIterator.next();

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).

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().


Mvh,
--
Filip Larsen <filip.larsen@mail.dk>



Christian Andersen (11-12-2002)
Kommentar
Fra : Christian Andersen


Dato : 11-12-02 16:30

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

Filip Larsen (11-12-2002)
Kommentar
Fra : Filip Larsen


Dato : 11-12-02 19:16

Christian Andersen skrev

> 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...
> }
> }

Hvis det var mig vill jeg nok bruge instanceof-operatoren i stedet, dvs.

for (int i = 0; i < elements.size(); i++) {
Object element = elements.get(i);
if (element instanceof AMat) {
AMat a = (AMat) element;
if (aMat.getMinLager() >= 17) ...
} else ...
}

da et element ikke bør implementere en type (her AMat) hvis ikke den opfører
sig som typen skal (Liskovs substitutionsprincip).


Mvh,
--
Filip Larsen <filip.larsen@mail.dk>



Christian Andersen (11-12-2002)
Kommentar
Fra : Christian Andersen


Dato : 11-12-02 19:41

Filip Larsen wrote:

>> if (obj.getClass().equals(AMat.class))

<snip>

> Hvis det var mig vill jeg nok bruge instanceof-operatoren i stedet, dvs.

<snip>

> da et element ikke bør implementere en type (her AMat) hvis ikke den opfører
> sig som typen skal (Liskovs substitutionsprincip).

Interessant! Google hjalp mig med Liskov:

"Functions that use pointers or references to base classes must be able
to use objects of derived classes without knowing it"

og derefter er der et eksempel på hvordan man IKKE skal gøre, der ligner
mit til forveksling. Hmmm ...

Mange tak for tippet.

--
..signature

Ulrik Magnusson (12-12-2002)
Kommentar
Fra : Ulrik Magnusson


Dato : 12-12-02 08:41



Christian Andersen wrote:
<snip>

> Dog kan jeg ikke forstå at man stadigvæk bliver nødt til at caste:
>
> 9. LinkedList<String> stringList = new LinkedList<String>();
>
> [...]
>
> 40. while (listIterator.hasNext()) {
> 41. item = (String)listIterator.next();

Jeg kan altså ikke finde den version af linie 41 på
<http://developer.java.sun.com/developer/technicalArticles/releases/generics/>:

41. item = listIterator.next();
42.
43. /* genericsEx2.java:41: incompatible types
44. ** found : java.lang.Integer
45. ** required: java.lang.String
46. */

problemet er her at listIterator returnerer en Integer og item er
String:

22. Iterator<Integer> listIterator = integerList.iterator();
23. String item;

Derfor giver "item = listIterator.next();" kompileringsfejl og ikke
runtimefejl. (et cast nytter ikke noget - idag kan man heller ikke
gøre følgende:

Integer i = new Integer(42);
String str = (String)i;

- det giver bare

inconvertible types
found : java.lang.Integer
required: java.lang.String
String str = (String)i;
^
1 error

Ulrik Magnusson




Filip Larsen (12-12-2002)
Kommentar
Fra : Filip Larsen


Dato : 12-12-02 12:03

Ulrik Magnusson skrev

> Jeg kan altså ikke finde den version af linie 41 på
> <http://developer.java.sun.com/developer/technicalArticles/releases/generics/>:

De har åbenbart rettet siden fornyelig. Den side jeg så havde kun to
kompileringsfejl remset op i kommentarene, nu er der 3. Vi er nok ikke
de eneste der har bemærket, at der var noget galt :)


Mvh,
--
Filip Larsen <filip.larsen@mail.dk>

Ulrik Magnusson (12-12-2002)
Kommentar
Fra : Ulrik Magnusson


Dato : 12-12-02 17:56



Filip Larsen wrote:

> Ulrik Magnusson skrev
>
> > Jeg kan altså ikke finde den version af linie 41 på
> > <http://developer.java.sun.com/developer/technicalArticles/releases/generics/>:
>
> De har åbenbart rettet siden fornyelig. Den side jeg så havde kun to
> kompileringsfejl remset op i kommentarene, nu er der 3. Vi er nok ikke
> de eneste der har bemærket, at der var noget galt :)

lol! Jeg troede, jeg var ved at blive skør..

Ulrik Magnusson


Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408509
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste