Υπάρχει μια καλή συζήτηση για τα Generics και τι πραγματικά κάνουν πίσω από τις σκηνές στο this question, οπότε όλοι γνωρίζουμε ότι το Vector<int[]>
είναι ένα διάνυσμα από πίνακες ακεραίων αριθμών, και το HashTable<String, Person>
είναι ένας πίνακας του οποίου τα κλειδιά είναι συμβολοσειρές και οι τιμές Person
s.
Ωστόσο, αυτό που με προβληματίζει είναι η χρήση της Class<>
.
Η κλάση java Class
υποτίθεται ότι παίρνει και ένα όνομα προτύπου, (ή έτσι μου λέει η κίτρινη υπογράμμιση στο eclipse). Δεν καταλαβαίνω τι πρέπει να βάλω εκεί μέσα. Το όλο νόημα του αντικειμένου Class
είναι όταν δεν έχετε πλήρως τις πληροφορίες για ένα αντικείμενο, για την αντανάκλαση και άλλα τέτοια. Γιατί με αναγκάζει να καθορίσω ποια κλάση θα περιέχει το αντικείμενο Class
; Προφανώς δεν ξέρω, αλλιώς δεν θα χρησιμοποιούσα το αντικείμενο Class
, θα χρησιμοποιούσα το συγκεκριμένο.
Η χρήση της γενικευμένης έκδοσης της κλάσης Class σας επιτρέπει, μεταξύ άλλων, να γράφετε πράγματα όπως
Class<? extends Collection> someCollectionClass = someMethod();
και τότε μπορείτε να είστε σίγουροι ότι το αντικείμενο Class που λαμβάνετε επεκτείνει την Collection
, και μια περίπτωση αυτής της κλάσης θα είναι (τουλάχιστον) μια Collection.
Από την τεκμηρίωση της Java:
[...] Πιο εκπληκτικά, η κλάση Class έχει δημιουργηθεί. Τα literals της κλάσης λειτουργούν τώρα ως type tokens, παρέχοντας πληροφορίες τύπου τόσο σε χρόνο εκτέλεσης όσο και σε χρόνο μεταγλώττισης. Αυτό επιτρέπει ένα στυλ στατικών εργοστασίων που παραδειγματίζεται από τη μέθοδο getAnnotation στη νέα διεπαφή AnnotatedElement:
<T extends Annotation> T getAnnotation(Class<T> annotationType);
Αυτή είναι μια γενική μέθοδος. Συμπεραίνει την τιμή της παραμέτρου τύπου της T από το όρισμά της και επιστρέφει ένα κατάλληλο παράδειγμα της T, όπως φαίνεται από το ακόλουθο απόσπασμα:
Author a = Othello.class.getAnnotation(Author.class);
Πριν από τις generics, θα έπρεπε να μετατρέψετε το αποτέλεσμα σε Author. Επίσης, δεν θα είχατε τρόπο να κάνετε τον μεταγλωττιστή να ελέγξει ότι η πραγματική παράμετρος αντιπροσώπευε μια υποκλάση της Annotation. [...]
Λοιπόν, ποτέ δεν χρειάστηκε να χρησιμοποιήσω τέτοιου είδους πράγματα. Κάποιος;
Συχνά θέλετε να χρησιμοποιείτε μπαλαντέρ με το Class
. Για παράδειγμα, η Class<? extends JComponent>
, θα σας επέτρεπε να καθορίσετε ότι η κλάση είναι κάποια υποκλάση της JComponent
. Εάν έχετε ανακτήσει την περίπτωση Class
από το Class.forName
, τότε μπορείτε να χρησιμοποιήσετε το Class.asSubclass
για να κάνετε το cast πριν προσπαθήσετε, ας πούμε, να κατασκευάσετε μια περίπτωση.