Έχουν δημοσιευτεί Κυριακή, 12 Νοεμβρίου 2006 3:14 μμ από το μέλος PALLADIN

Java Generics and type erasure

Πρόσφατα έκανα code review σε ένα Java 1.5 project και βρέθηκα αντιμέτωπος "για άλλη μια φορά" με τα προβλήματα που δημιουργεί το type erasure των Java Generics.
Θα παρουσιάσω το πρόβλημα με ένα απλό κομμάτι κώδικα

        ArrayList<Integer> listOfInteger = new ArrayList<Integer>();
        ArrayList list = listOfInteger;
        list.add(new Object());

        int test = listOfInteger.get(0);

Οπότε ένα ωραιότατο ClassCastException καραδοκεί να μας αιφνιδιάσει. Τουλάχιστον τα unit tests στο JUnit βοήθησαν την κατάσταση.
Ένα πολύ καλό βιβλίο για το θέμα είναι το κάτωθι
http://www.amazon.com/Java-Generics-Collections-Maurice-Naftalin/dp/0596527756

(Πολύ δεν μιλήσαμε για Java…. Άλλωστε στο dotnetzone βρισκόμαστε...)
Όπως και να έχει, αισθάνομαι μια μεγαλύτερη ασφάλεια από InvalidCastException στον C# 2.0 κώδικά μου :)

Share


Ενημέρωση για Σχόλια

Αν θα θέλατε να λαμβάνετε ένα e-mail όταν γίνονται ανανεώσεις στο περιεχόμενο αυτής της δημοσίευσης, παρακαλούμε γίνετε συνδρομητής εδώ

Παραμείνετε ενήμεροι στα τελευταία σχόλια με την χρήση του αγαπημένου σας RSS Aggregator και συνδρομή στη Τροφοδοσία RSS με σχόλια

Σχόλια:

 

Δημήτρης Σουφλής έγραψε:

Βγάζει όμως warning.

test.java:7: warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.ArrayList

       list.add(new Object());

Το πρόβλημα εμφανίζεται όταν χρησιμοποιείς  παλιό κώδικα που δεν ξέρει από generics, ή reflection. Σε καινούριο κώδικα τα πάντα θα ελεγχθούν από τον compiler.

Συμφωνώ πάντως ότι το type erasure είναι ένα hack για να μην αλλάξουν το JVM, και όχι μια λύση διαρκείας.

(dsouflis)

Αυγούστου 30, 2007 2:14 μμ

Ποιά είναι η άποψή σας για την παραπάνω δημοσίευση;

(απαιτούμενο)
απαιτούμενο
προαιρετικό
απαιτούμενο
ÅéóÜãåôå ôïí êùäéêü:
CAPTCHA Image