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