java generic array how simulate generic arrays java
Αυτό το σεμινάριο εξηγεί πώς να προσομοιώσετε τη λειτουργικότητα του Generic Array στην Java χρησιμοποιώντας Object Array και επίσης χρησιμοποιώντας την κατηγορία Reflection με απλό παράδειγμα:
Έχουμε ήδη συζητήσει Γενόσημα Java σε ένα από τα προηγούμενα μαθήματά μας. Η Java επιτρέπει γενικές τάξεις, μεθόδους κ.λπ. που μπορούν να δηλωθούν ανεξάρτητα από τύπους. Ωστόσο, η Java δεν επιτρέπει τον πίνακα να είναι γενικός.
Ο λόγος για αυτό είναι ότι στην Java, οι πίνακες περιέχουν πληροφορίες που σχετίζονται με τα συστατικά τους και αυτές οι πληροφορίες χρησιμοποιούνται για την εκχώρηση μνήμης κατά το χρόνο εκτέλεσης. Όταν χρησιμοποιούνται γενικά, λόγω διαγραφής τύπου, ο κωδικός byte δεν περιέχει καμία γενική πληροφορία.
=> Επισκεφθείτε εδώ για να μάθετε Java από το μηδέν.
Τι θα μάθετε:
Γενική συστοιχία στην Ιάβα
Εάν έχετε ορίσει έναν γενικό πίνακα, τότε ο τύπος στοιχείου δεν θα είναι γνωστός κατά το χρόνο εκτέλεσης. Επομένως, δεν συνιστάται ο ορισμός των συστοιχιών ως γενικών στη Java.
Ο ορισμός Generic Array είναι όπως φαίνεται παρακάτω:
E () newArray = new E(length);
Ο μεταγλωττιστής δεν γνωρίζει τον ακριβή τύπο που πρέπει να δημιουργηθεί, καθώς οι πληροφορίες τύπου δεν είναι διαθέσιμες κατά το χρόνο εκτέλεσης.
Έτσι αντί για πίνακες, όποτε απαιτούνται γενικά, πρέπει να προτιμάτε το στοιχείο λίστας του πλαισίου Java Συλλογές. Ωστόσο, μπορείτε να δημιουργήσετε γενικές δομές που μοιάζουν με πίνακες χρησιμοποιώντας πίνακα αντικειμένων και δυνατότητα ανάκλασης της Java.
Αυτές οι δύο προσεγγίσεις που μας επιτρέπουν να καθορίσουμε πίνακες διαφορετικών τύπων δεδομένων εξηγούνται παρακάτω λεπτομερώς.
ερωτήσεις και απαντήσεις για δοκιμές για κινητές συσκευές για έμπειρους
Δημιουργήστε και αρχικοποιήστε τη γενική σειρά
Σε αυτήν την ενότητα, ας δημιουργήσουμε μια δομή τύπου πίνακα που είναι γενικής φύσης. Χρησιμοποιώντας αυτές τις δομές, θα μπορείτε να δημιουργήσετε πίνακες παρέχοντας τον τύπο δεδομένων ως επιχείρημα.
Χρησιμοποιώντας το Object Array
Αυτή η προσέγγιση χρησιμοποιεί τον πίνακα αντικειμένων τύπου ως μέλος της κύριας κλάσης πίνακα. Χρησιμοποιούμε επίσης μεθόδους get / set για ανάγνωση και ρύθμιση των στοιχείων του πίνακα. Στη συνέχεια, δημιουργούμε την κύρια τάξη πίνακα που μας επιτρέπει να παρέχουμε τον τύπο δεδομένων όπως απαιτείται.
Αυτό προσομοιώνει τον γενικό πίνακα.
Το ακόλουθο πρόγραμμα δείχνει τη χρήση πίνακα αντικειμένων για τη δημιουργία μιας γενικής δομής τύπου συστοιχίας.
import java.util.Arrays; class Array { private final Object() obj_array; //object array public final int length; // class constructor public Array(int length) { // instantiate a new Object array of specified length obj_array = new Object (length); this.length = length; } // get obj_array(i) E get(int i) { @SuppressWarnings('unchecked') final E e = (E)obj_array(i); return e; } // set e at obj_array(i) void set(int i, E e) { obj_array(i) = e; } @Override public String toString() { return Arrays.toString(obj_array); } } class Main { public static void main(String() args){ final int length = 5; // creating integer array Arrayint_Array = new Array(length); System.out.print('Generic Array :' + ' '); for (int i = 0; i Παραγωγή:

Στο παραπάνω πρόγραμμα, έχουμε ορίσει μια κατηγορία Array που είναι γενική. Ο πίνακας αντικειμένων είναι μέλος της κλάσης που δημιουργείται χρησιμοποιώντας έναν κατασκευαστή και μήκος. Χρησιμοποιούμε επίσης τις γενικές μεθόδους λήψης και καθορισμού που χρησιμοποιούνται για την ανάγνωση και τη ρύθμιση ενός στοιχείου πίνακα ενός συγκεκριμένου τύπου.
Στη συνέχεια, δημιουργούμε παρουσίες αυτής της κλάσης πίνακα. Κατά τη δημιουργία παρουσιών, μπορούμε να καθορίσουμε τον επιθυμητό τύπο. Στο παραπάνω πρόγραμμα, έχουμε δημιουργήσει δύο πίνακες τύπου Integer και String και στη συνέχεια συμπληρώνουμε αυτές τις συστοιχίες με τις κατάλληλες τιμές (χρησιμοποιώντας τη μέθοδο set).
Τέλος, χρησιμοποιώντας την παράκαμψη μέθοδο «toString», προβάλλουμε το περιεχόμενο κάθε μιας από αυτές τις παρουσίες.
διαφορά μεταξύ δοκιμών whitebox και blackbox
Χρησιμοποιώντας προβληματισμό
Σε αυτήν την προσέγγιση, χρησιμοποιούμε μια κλάση προβληματισμού για να δημιουργήσουμε έναν γενικό πίνακα του οποίου ο τύπος θα είναι γνωστός μόνο κατά το χρόνο εκτέλεσης.
Η προσέγγιση είναι παρόμοια με την προηγούμενη με μία μόνο διαφορά, δηλαδή χρησιμοποιούμε κλάση αντανάκλασης στον ίδιο τον κατασκευαστή για να δημιουργήσουμε έναν πίνακα αντικειμένων μεταφέροντας ρητά τις πληροφορίες τύπου δεδομένων στον κατασκευαστή κλάσης.
Αυτός ο τύπος πληροφοριών μεταβιβάζεται στη μέθοδο προβληματισμού Array.newInstance.
Το ακόλουθο πρόγραμμα δείχνει τη χρήση του προβληματισμού για τη δημιουργία ενός γενικού πίνακα . Σημειώστε ότι ολόκληρη η δομή του προγράμματος είναι παρόμοια με την προηγούμενη προσέγγιση με τη διαφορά στη χρήση των χαρακτηριστικών ανάκλασης.
importjava.util.Arrays; class Array { private final E() objArray; public final int length; // class constructor public Array(ClassdataType, int length){ // create a new array with the specified data type and length at runtime using reflection this.objArray = (E()) java.lang.reflect.Array.newInstance(dataType, length); this.length = length; } // get element at objArray(i) Eget(int i) { returnobjArray(i); } // assign e to objArray(i) void set(int i, E e) { objArray(i) = e; } @Override public String toString() { return Arrays.toString(objArray); } } class Main { public static void main(String() args){ final int length = 5; // create array with Integer as data type Arrayint_Array = new Array(Integer.class, length); System.out.print('Generic Array:' + ' '); for (int i = 0; i Παραγωγή:

Το παραπάνω πρόγραμμα δείχνει πίνακες δύο τύπων, δηλαδή Integer και String που δημιουργήθηκαν από την γενική κλάση Arrays.
Γενικό σφάλμα δημιουργίας συστοιχίας
Έχουμε ήδη συζητήσει τις επιπτώσεις της δημιουργίας γενικών συστοιχιών στην Java και γιατί δεν είναι δυνατόν να υπάρχουν γενικοί πίνακες στην Java. Μια άλλη εξήγηση σε αυτό είναι ότι οι πίνακες στην Java είναι συνωμοτικές ενώ οι γενικές δεν είναι. Τα γενόσημα είναι αμετάβλητα.
Με συνδιακύμανση, εννοούμε ότι ένας πίνακας του υποτύπου μπορεί να αντιστοιχιστεί στην αναφορά supertype.
Αυτό σημαίνει ότι η ακόλουθη δήλωση θα λειτουργήσει καλά.
Number numArray() = new Integer(10);
Καθώς ο ακέραιος αριθμός είναι ένας δευτερεύων τύπος αριθμού, η παραπάνω δήλωση συγκεντρώνει μια χαρά.
Αλλά αν χρησιμοποιούμε την ίδια έννοια με τα γενικά, δεν θα λειτουργήσει, δηλαδή με τα γενικά, δεν μπορούμε να αντιστοιχίσουμε τον υποτύπο γενικό σε ένα supertype generic.
Η δήλωση, ListobjList = new ArrayList (); θα δώσει ένα σφάλμα συλλογής, καθώς τα γενικά δεν είναι συνωμοτικά σαν πίνακες.
Λαμβάνοντας υπόψη τον παραπάνω λόγο, δεν μπορούμε να έχουμε κάτι όπως παρακάτω:
public static ArrayList() myarray = new ArrayList(2);
Αυτή η δήλωση δεν θα μεταγλωττιστεί με το σφάλμα, «Γενική δημιουργία πίνακα» καθώς δεν μπορούμε να δηλώσουμε μια σειρά από αναφορές σε έναν συγκεκριμένο γενικό τύπο.
Μπορούμε, ωστόσο, να δημιουργήσουμε μια σειρά από αναφορές σε έναν συγκεκριμένο γενικό τύπο χρησιμοποιώντας μπαλαντέρ. Η παραπάνω δήλωση μπορεί να μεταγλωττιστεί επιτυχώς με μια μικρή αλλαγή της χρήσης μπαλαντέρ όπως φαίνεται παρακάτω.
public static ArrayListmyarray = new ArrayList(5);
Η παραπάνω δήλωση θα μεταγλωττιστεί με επιτυχία.
Το παρακάτω πρόγραμμα δείχνει μια επίδειξη της χρήσης μπαλαντέρ.
διαφορά μεταξύ c c ++ και java
import java.util.*; //generic array class classArr { T tarray(); Arr(T myarray()) { tarray = myarray; } @Override public String toString() { return Arrays.toString(tarray); } } public class Main { public static void main(String() args) { // Arrtarray() = new Arr(5); //error: generic array creation //initialize new array objects Arr arr1 = new Arr(new Integer(){2,4,6,8,10}); System.out.print('Array with Integer type:' + ' '); System.out.println(arr1); Arr arr2 = new Arr(new String(){'aa', 'bb', 'cc', 'dd'}); System.out.print('Array with String type:' + ' '); System.out.println(arr2); //define array objects using wildcard Arrarr3() = new Arr(5); arr3(0) = new Arr(new Integer(){10, 20, 30, 40, 50}); System.out.println('Integer array: ' + arr3(0)); arr3(1) = new Arr(new Float(){1.1f, 2.2f, 3.3f, 4.4f, 5.5f}); System.out.println('Float array: ' + arr3(1)); } }
Παραγωγή:

Στο παραπάνω πρόγραμμα, έχουμε την πρώτη δήλωση στην κύρια μέθοδο που δείχνει την αναλλοίωτη γενική. Αυτή η δήλωση θα αναβοσβήνει το σφάλμα συλλογής (εμφανίζεται στα σχόλια). Η επόμενη δημιουργία πίνακα είναι σύμφωνα με τους κανόνες των γενικών και συνεπώς συντάσσουν με επιτυχία.
Συχνές Ερωτήσεις
Q # 1) Τι είναι μια γενική σειρά;
Απάντηση: Οι πίνακες που είναι ανεξάρτητοι από τον τύπο δεδομένων και των οποίων ο τύπος πληροφοριών αξιολογείται κατά το χρόνο εκτέλεσης είναι γενικοί πίνακες. Τα γενικά είναι παρόμοια με τα πρότυπα στο C ++.
Q # 2) Μπορείτε να δημιουργήσετε ένα Generic Array στην Java;
Απάντηση: Οι συστοιχίες είναι συμβατικές σε Java, δηλαδή οποιοσδήποτε πίνακας υποκατηγορίας μπορεί να αντιστοιχιστεί σε έναν πίνακα τύπου. Τα γενικά, ωστόσο, είναι αμετάβλητα, δηλαδή δεν μπορείτε να αντιστοιχίσετε πίνακας τύπου υποκατηγορίας σε τύπο superclass.
Δεύτερον, οι γενικές πληροφορίες αφαιρούνται από το JVM και συνεπώς, ο πίνακας του οποίου η κατανομή μνήμης γίνεται κατά το χρόνο εκτέλεσης δεν γνωρίζει ποιος τύπος πρέπει να αντιστοιχιστεί στον πίνακα. Έτσι, οι πίνακες και τα γενικά δεν ταιριάζουν καλά στην Java.
Q # 3) Τι είναι ο τύπος Ε στην Java;
Απάντηση: ενεργεί ως σύμβολο κράτησης θέσης για γενικά και αντιπροσωπεύει κάθε τύπο στοιχείου.
Q # 4) Τι είναι η Διαγραφή τύπου στην Java;
Απάντηση: Μια διαδικασία που πραγματοποιείται από τον μεταγλωττιστή Java με τον οποίο οι παραμετροποιημένοι τύποι που χρησιμοποιούνται στα γενικά αφαιρούνται και αντιστοιχίζονται σε ακατέργαστους τύπους σε κώδικα byte. Ως εκ τούτου, ο κωδικός byte δεν περιέχει πληροφορίες σχετικά με τα γενικά.
Q # 5) Τι είναι ο πρώτος τύπος στην Java;
Απάντηση: Οι πρώτοι τύποι είναι γενικοί τύποι χωρίς τη χρήση της παραμέτρου τύπου. Π.χ. Η λίστα είναι ένας πρώτος τύπος. ενώ η Λίστα είναι ένας παράμετρος τύπου.
συμπέρασμα
Στην Java, ο γενικός πίνακας δεν μπορεί να οριστεί άμεσα, δηλαδή δεν μπορείτε να ορίσετε έναν παραμετροποιημένο τύπο σε μια αναφορά πίνακα. Ωστόσο, χρησιμοποιώντας πίνακες αντικειμένων και δυνατότητες ανάκλασης, μπορείτε να προσομοιώσετε τη δημιουργία γενικού πίνακα.
Έχουμε δει αυτές τις δύο προσεγγίσεις σε αυτό το σεμινάριο μαζί με τις λεπτομέρειες του γενικού σφάλματος δημιουργίας συστοιχιών και τις δυνατότητες πρόληψης αυτού του σφάλματος. Με λίγα λόγια, στην Ιάβα, μπορείτε να πείτε ότι οι πίνακες και τα γενόσημα δεν συμβαδίζουν καθώς οι πίνακες είναι συνωμοτικές ενώ οι γενικές γραμμές είναι αμετάβλητες.
=> Ανατρέξτε στον τέλειο οδηγό εκπαίδευσης Java εδώ.
Συνιστώμενη ανάγνωση
- Java Array - Πώς να εκτυπώσετε στοιχεία ενός πίνακα στην Java;
- Εκμάθηση μήκους σειράς Java με παραδείγματα κώδικα
- Εκμάθηση Java Reflection με παραδείγματα
- Java Array - Δήλωση, δημιουργία και αρχικοποίηση μιας σειράς στην Java
- Εισαγωγή σε πίνακες Java και σχετικές έννοιες
- Tutorial Java Generics με παραδείγματα
- Εκμάθηση Java SWING: Container, Components and Event Handling
- Java DataTypes, Loops, Arrays, Switch και Assertions