java:generics_raw

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Απλοί παραμετρικοί τύποι δεδομένων (Raw Generic Types) ====== Όπως δείξαμε προηγούμενα, τα αντικείμενα της κλάσης //Box// ορίζονται σε συνδυασμό με ένα reference τύπο δεδομένων. Υπάρχει η δυνατότητα να ορίσετε ένα αντικείμενο της κλάσης //Box// χωρίς την χρήση της επιπλέον παραμέτρου, όπως παρακάτω. <code java> Box b = new Box(); </code> Σε αυτή την περίπτωση καταλήγουμε να έχουμε έναν μη-παραμετρικό τύπο δεδομένων. Ο μεταγλωττιστής δεν είναι σε θέση να γνωρίζει τον τύπο δεδομένων που θα τοποθετήσετε στο συγκεκριμένο αντικείμενο. Ουσιαστικά η παραπάνω δήλωση ισοδυναμεί με μία δήλωση της μορφής. <code java> Box<Object> b = new Box<Object>(); </code> Η προσπάθεια μεταγλώττισης του παρακάτω κώδικα καταδεικνύει το παραπάνω <code java BoxUsage.java> public class BoxUsage { public static void main(String args[]) { Box b = new Box(5); Box<Number> bn = new Box<>(); bn.set(b.get()); } } </code> Το μήνυμα που εμφανίζει ο μεταγλωττιστής για τον παραπάνω κώδικα είναι το εξής: <code> $> javac BoxUsage.java BoxUsage.java:5: error: method set in class Box<T> cannot be applied to given types; bn.set(b.get()); ^ required: Number found: Object reason: actual argument Object cannot be converted to Number by method invocation conversion where T is a type-variable: T extends Object declared in class Box Note: BoxUsage.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 1 error </code> Αν αλλάξετε την γραμμή ''Box<Number> bn = new Box<>();'' σε ''Box<Object> bn = new Box<>();'' το λάθος μεταγλώττισης εξαφανίζεται και εμφανίζεται ένα //warning// που επισημαίνει ότι στην γραμμή 3 χρησιμοποιείται ένας παραμετρικός τύπος ως απλός (raw generic type). <WRAP center round important 60%> ΔΕΝ συνιστάται σε καμία περίπτωση η χρήση παραμετρικών τύπων (generic types) ως απλών. </WRAP> ===== Compiler Warnings από τη μίξη παραμετρικών και μη παραμετρικών τύπων δεδομένων ===== Η μη χρήση των παραμετρικών τύπων δεδομένων δυσκολεύει τον μεταγλωττιστή να αποφασίσει για την ασφαλή ή μη ασφαλή χρήση των δεδομένων που θα αποθηκευτούν στην κλάση. Η μίξη generics με raw types μπορεί να δημιουργήσει warnings της παρακάτω μορφής κατά την μεταγλώττιση. <code> Note: Example.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. </code> Δείτε τα παρακάτω παραδείγματα κώδικα <code java> Box<String> stringBox = new Box<>(); Box rawBox = stringBox; // Safe - OK </code> <code java> Box rawBox = new Box(); // rawBox is a raw type of Box<T> Box<Integer> intBox = rawBox; // warning: unchecked conversion </code> <code java> Box<String> stringBox = new Box<>(); Box rawBox = stringBox; rawBox.set(8); // warning: unchecked invocation to set(T) </code> Το παρακάτω παράδειγμα είναι επίσης ενδεικτικό: <code java WarningDemo.java> public class WarningDemo { public static void main(String[] args){ Box<Integer> bi; bi = createBox(); } static Box createBox(){ return new Box(); } } </code> Μεταγλωττίζοντας με το flag ''-Xlint:unchecked'' εμφανίζεται το παρακάτω μήνυμα. <code> WarningDemo.java:4: warning: [unchecked] unchecked conversion found : Box required: Box<java.lang.Integer> bi = createBox(); ^ 1 warning </code> |Προηγούμενο: [[:java:generics_multiple_params | Παραμετρικοί τύποι δεδομένων με πολλές παραμέτρους ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:collections_intro | Collections ]] |

java/generics_raw.1493965344.txt.gz · Last modified: 2017/05/05 06:22 by gthanos