Η Java δεν μπορεί να δημιουργήσει έναν γενικό πίνακα παραμετροποιημένων τύπων

Java Cannot Create Generic Array Parameterized Types



Δεν είναι δυνατόν να δημιουργηθεί ένας πίνακας παραμέτρων τύπων σε java generics, για παράδειγμα:

Pair<String>[] table = new Pair<String>[10] //Error

Γιατί είναι αυτό? Στην πραγματικότητα, ο κύριος σκοπός είναι να αποφευχθούν στοιχεία με ασυνεπείς τύπους στον πίνακα.



Ας ρίξουμε μια πρώτη ματιά, εάν ο πίνακας μπορεί να αποθηκεύσει άλλους τύπους στοιχείων



Pair[] table = new Pair[10] table[0] = new Object() //Compile Error

Προφανώς αποθηκεύστε απευθείας, ο μεταγλωττιστής θα αναφέρει ένα σφάλμα. Λοιπόν, μετατρέψτε τον πίνακα και αποθηκεύστε τον ξανά;



Pair[] table = new Pair[10] Object[] o = table //Automatic conversion o[0] = new Object()

Προς το παρόν, ο μεταγλωττιστής δεν θα αναφέρει σφάλμα, αλλά θα ρίξει κατά το χρόνο εκτέλεσης ArrayStoreException ασυνήθιστος

Εξηγεί ότι ο έλεγχος αποθήκευσης πίνακα είναι πολύ αυστηρός, μπορεί να αποθηκευτεί μόνο Τύπος στοιχείου κατά τη δημιουργία

Ωστόσο, η γενική διαγραφή θα καταστρέψει αυτόν τον μηχανισμό, για παράδειγμα:



Pair<String>[] table = new Pair<String>[10] //Assuming it can Object[] o = table //Generic erasure becomes Pair[], and upwards are automatically converted to Object[] o[0] = new Pair<Double>()

Θα διαπιστώσετε ότι το στοιχείο Pair είναι αποθηκευμένο στον πίνακα Pair αυτήν τη στιγμή

Φυσικά, οι ακόλουθες προϋποθέσεις εξακολουθούν να μην είναι αποδεκτές:

o[1] = new Object() // No error is reported when compiling, and an exception is thrown when running

Εν ολίγοις, η Java δεν επιτρέπει τη δημιουργία παραμετροποιημένων γενικών συστοιχιών για την προστασία της ασφάλειας των συστοιχιών.

Επιπλέον, αν και δεν μπορούν να δημιουργηθούν παραμετροποιημένοι γενικοί πίνακες, μπορούν να δημιουργηθούν γενικοί πίνακες μπαλαντέρ.

Pair<?>[] table = new Pair<?>[10]

Αυτό είναι δυνατό, επειδή το νέο Pair σημαίνει ότι ο πίνακας μπορεί να αποθηκεύσει ζεύγη οποιασδήποτε παραμέτρου, όπως Pair και Pair.

Επιπλέον, μπορείτε επίσης να δημιουργήσετε

Pair<String>[] table = new Pair[10] //Compatible conversion, not parent-child relationship table[0] = new Pair<Double> //Compile Error

Προς το παρόν, αν και ο πραγματικός τύπος του πίνακα είναι Pair, δηλώνεται ως Pair, οπότε αναφέρεται ένα σφάλμα.
Ο λόγος είναι ότι οι γενικοί τύποι και οι πρωτόγονοι τύποι μπορούν να μετατραπούν, αλλά δεν κληρονομούνται. Είναι λογικό ότι το ζεύγος μπορεί να μετατραπεί σε ζεύγος και πρέπει να μπορεί να αποθηκευτεί, αλλά το δηλωμένο ζεύγος δεν είναι ο γονέας του ζεύγους, επομένως το ζεύγος δεν μπορεί να αποθηκευτεί.

Ωστόσο, οι ακόλουθες μέθοδοι μπορούν να λειτουργήσουν κανονικά

Object[] o =table o[0] = new Pair<Double>