User Tools

Site Tools


java:generics_raw

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

java:generics_raw [2017/02/07 17:03]
gthanos [Unchecked Error Messages]
java:generics_raw [2017/02/07 17:03]
Line 1: Line 1:
-====== Απλοί παραμετρικοί τύποι δεδομένων (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). 
- 
-===== Unchecked Error Messages ===== 
- 
-Η μη χρήση των παραμετρικών τύπων δεδομένων δυσκολεύει τον μεταγλωττιστή να αποφασίσει για την ασφαλή ή μη ασφαλή χρήση των δεδομένων που θα αποθηκευτούν στην κλάση. Η μίξη 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:generic_methods | Παραμετρικοί τύποι δεδομένων σε μεθόδους (Generic Methods)  ]] | 
- 
  
java/generics_raw.txt · Last modified: 2017/02/07 17:03 (external edit)