Java casting string int. Πληκτρολογήστε casting σε Java

1. Τι είναι ρητή και αυτόματη χύτευση σε εκφράσεις;

Η χύτευση τύπου μπορεί να είναι ρητή ή αυτόματη.

Με τη χύτευση ρητού τύπου, η ίδια η λειτουργία χύτευσης προσδιορίζεται ρητά.

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

  • Και οι δύο τύποι πρέπει να είναι συμβατοί.
  • μήκος πρωτότυπο τύπο(τύπος πηγής) πρέπει να είναι μικρότερο από το μήκος τύπος στόχου(τύπος δέκτη).

2. Πώς φαίνεται η χύτευση ρητού τύπου στις εκφράσεις; Παραδείγματα

Η χύτευση σαφούς τύπου επιτρέπει την αντιστοίχιση μη συμβατών τύπων. Γενική μορφήΈνα καστ ρητού τύπου μοιάζει με αυτό:

(τύπος_στόχου) τιμή

target_type– αυτός είναι ο τύπος στον οποίο θέλετε να μεταδώσετε το καθορισμένο έννοια.

Παραδείγματαχύτευση ρητού τύπου.

// χύτευση ρητού τύπου σε εκφράσεις byte b; int a? διπλό d? float f; d = -39,9203; a = (int )d; // a = -39 f = (float )d; // f = -39,9203 b = (byte )d; // b = -39 d = 302930932; b = (byte )d; // b = -12 - περικοπή της τιμής a = -27; b = (byte)a; // b = -27

3. Παραδείγματα αυτόματου τύπου χύτευσης

Παράδειγμα 1. Αυτόματη χύτευση ακέραιων τύπων.

// αυτόματη χύτευση ακέραιων τύπων int a? byte b; κοντό sh? b = -23; a = b; // a = -23 - αυτόματη χύτευση τύπου sh = -150; a = sh; // a = -150 μήκος l = 200; // Σφάλμα: "Αναντιστοιχία τύπου: δεν είναι δυνατή η μετατροπή από long σε int" // a = l; l = b; // l = -23 l = sh; // l = -150 char c = "Z" ; a = c; // a = 90 - κωδικός χαρακτήρων "Z" boolean b1 = false ; //a = b1; - σφάλμα, οι τύποι δεν είναι συμβατοί

Παράδειγμα 2. Αυτόματη χύτευση τύπων κινητής υποδιαστολής.

// αυτόματη χύτευση τύπων κινητής υποδιαστολής float f; διπλό d? f = 3,409033f; d = f; // d = 3,409033

Παράδειγμα 3. Αυτόματη χύτευση μεικτούς τύπους. Αυτή η περίπτωση είναι δυνατή εάν μεταβλητού τύπουκινητής υποδιαστολής εκχωρείται η τιμή μιας μεταβλητής ακέραιου τύπου.

// αυτόματη χύτευση μικτών τύπων float f; διπλό d? a = 28; d = a; // d = 28,0 f = a; // f = 28,0 // Σφάλμα: Ασυμφωνία τύπου: δεν είναι δυνατή η μετατροπή από float σε int // a = f;

4. Πώς γίνεται η αυτόματη προώθηση τύπου σε εκφράσεις;

Η αυτόματη προώθηση τύπων εμφανίζεται σε εκφράσεις. Σε αυτήν την περίπτωση, οι τιμές που εμφανίζονται στις εκφράσεις προωθούνται αυτόματα σε τύπους με μεγάλα εύρη τιμών.

Κατά την αυτόματη προώθηση τύπων σε εκφράσεις:

  • εάν ένας από τους ακέραιους τελεστές είναι τύπου int, τότε όλες οι τιμές byte, short και char προωθούνται σε τύπου int;
  • Εάν ένας από τους ακέραιους τελεστές είναι τύπου long, τότε ολόκληρη η έκφραση προωθείται σε type long.
  • εάν ένας από τους τελεστές είναι τύπου float, τότε ο τύπος ολόκληρης της παράστασης θα είναι επίσης τύπου float (αν δεν υπάρχουν τελεστές τύπου double).
  • εάν ένας από τους τελεστές είναι τύπου double, τότε και ο τύπος ολόκληρης της παράστασης θα είναι διπλός.

5. Ένα παράδειγμα προώθησης από byte τύπου σε int στο οποίο η έκφραση δεν περιέχει μεταβλητούς τελεστές τύπου int (long)
// byte -> ενθ byte b; b = 1000 / 20; // b = 50, λειτουργεί επειδή το αποτέλεσμα τοποθετείται σε τύπο byte

Το παραπάνω παράδειγμα λειτουργεί σωστά γιατί:

  • το αποτέλεσμα τοποθετείται (συμβατό) στον τύπο byte.
  • δεν υπάρχουν τελεστές τύπου int.

Στο παραπάνω παράδειγμα, η τιμή 1000 υπερβαίνει το εύρος τιμών byte. Αρχικά, ο αριθμός 1000 μεταδίδεται για να πληκτρολογήσει int. Το αποτέλεσμα όμως

1000 / 20 = 50

μεταδίδεται σε byte και μπορεί να χωρέσει σωστά σε μια μεταβλητή σι .

Αν το γράψεις έτσι:

byte b; b = 100000 / 20; // σφάλμα επειδή το αποτέλεσμα δεν ταιριάζει στον τύπο byte

τότε θα εμφανιστεί ένα σφάλμα μεταγλώττισης με το μήνυμα:

Σε αυτήν την περίπτωση, το αποτέλεσμα δεν τοποθετείται στον τύπο byte:

100000 / 20 = 5000

Στη συνέχεια, αυτός ο αριθμός (5000) γίνεται αυτόματα τύπος int και ο μεταγλωττιστής θα δημιουργήσει ένα μήνυμα σφάλματος.

Εάν κάνετε καστ ρητού τύπου:

byte b; b = (byte) (100000 / 20); // b = -120

τότε σε αυτή την περίπτωση το αποτέλεσμα 5000 τύπου int μετατρέπεται σε byte τύπου. Όπως γνωρίζετε, μια μεταβλητή τύπου int καταλαμβάνει 32 bit και μια μεταβλητή τύπου byte καταλαμβάνει 8 bit. Η τιμή μιας μεταβλητής int περικόπτεται. Και έχουμε αυτό που έχουμε (b = -120).

Τα παραπάνω παραδείγματα ισχύουν επίσης για μεταβλητές τύπων short και char.

6. Παράδειγμα. Προώθηση από byte σε int όπου η έκφραση περιέχει έναν τελεστή μεταβλητής int
// προώθηση τύπων σε εκφράσεις // byte -> ενθ byte b; int d; d = 20; // σφάλμα, το αποτέλεσμα είναι τύπου int, αφού η μεταβλητή d είναι τύπου int // b = 1000 / d;

Στο παραπάνω παράδειγμα, η έκφραση χρησιμοποιεί μια μεταβλητή ρεπληκτρολογήστε int. Επομένως, ο μεταγλωττιστής θα παράγει ένα μήνυμα σφάλματος:

Αναντιστοιχία τύπου: δεν είναι δυνατή η μετατροπή από int σε byte

Αυτό σημαίνει ότι το αποτέλεσμα είναι int (όχι byte) ακόμα κι αν η τιμή ταιριάζει στο εύρος τιμών byte. Επειδή η έκφραση χρησιμοποιεί μια μεταβλητή τελεστή ρεπληκτρολογήστε int.

Εάν εκτελέσετε ένα cast ρητού τύπου, το αποτέλεσμα θα είναι σωστό:

// προώθηση τύπων σε εκφράσεις // byte -> ενθ byte b; int d; d = 20; b = (byte) (1000/d); // b = 50 - λειτουργεί σωστά

7. Παράδειγμα. Προώθηση από int σε long

Ένα παράδειγμα προώθησης τύπου από int σε long. Εάν ένας από τους τελεστές είναι τύπου long, τότε ολόκληρη η έκφραση προωθείται σε type long.

int d; longl? d = 10000 * 200; // έργα, d = 2000000 // Λάθος! Αναντιστοιχία τύπων: δεν μπορεί να μετατραπεί από long σε int // d = 1L * 2L; - Οι τελεστές 1L και 2L είναι μακρού τύπου l = 100; // σφάλμα, ένας από τους τελεστές είναι τύπου long // d = l * 2;

Όπως φαίνεται από το παράδειγμα, εάν ένας από τους τελεστές είναι τύπου long , τότε ολόκληρη η έκφραση γίνεται τύπου long .

Συχνά υπάρχει ανάγκη μετατροπής συμβολοσειρών σε τιμές άλλων τύπων, όπως int ή boolean, και αντίστροφα. Σύμφωνα με την αποδεκτή σύμβαση, η ευθύνη για τη μετατροπή της χορδής Vη τιμή ενός άλλου τύπου εκχωρείται στην αντίστοιχη μέθοδο αυτού του τύπου. Έτσι, για παράδειγμα, η μετατροπή μιας συμβολοσειράς σε τιμή int κάνει στατική μέθοδοςαπό την κλάση περιτυλίγματος Integer. Ο παρακάτω πίνακας παραθέτει όλους τους τύπους που μπορούν να μετατρέψουν τιμές σε συμβολοσειρές και αντίστροφα, και παραθέτει τις αντίστοιχες μεθόδους.

TYPE Μέθοδος μετατροπής - Μέθοδος μετατροπής από συμβολοσειρά

tion To line

boolean String.valueOf(boolean) new.Boolean(String). booleanvalue()

byte String.valueOf(byte) Byte.parseByte(string, int)

short String.valueOf(short) Short.parseShort(string, int)

int String.valueOf(int) Integer.parseInteger(string, int)

long String.valueOf(long) Long.parseLong(String, int)

float String.valueOf(float) Float.parseFloat(String)

double String.valueOf(double) Double.parseDouble(String)

Για να μετατρέψετε μια συμβολοσειρά σε μια Boolean τιμή, πρέπει να δημιουργήσετε ένα Boolean αντικείμενο και στη συνέχεια να υποβάλετε ερώτημα για την τιμή του. Όλες οι άλλες κλάσεις περιτυλίγματος περιέχουν τις αντίστοιχες μεθόδους αναλύω λέξη.Μέθοδοι αναλύω λέξηΟι ακέραιοι τύποι υπάρχουν σε δύο υπερφορτωμένες μορφές: η πρώτη, εκτός από τη συμβολοσειρά, απαιτεί τον καθορισμό ενός πρόσθετου ορίσματος τύπου int, που αντιπροσωπεύει τη βάση του συστήματος αριθμών - από 2 έως 32. το δεύτερο παίρνει μόνο μια παράμετρο συμβολοσειράς και από προεπιλογή προϋποθέτει τη χρήση μετρικό σύστημαΥπολογισμός. Σε όλες τις περιπτώσεις εκτός του Boolean, γίνεται η ακόλουθη υπόθεση: Εάν η συμβολοσειρά αντιπροσωπεύει μια τιμή που δεν μπορεί να μετατραπεί σωστά σε έναν αριθμό του κατάλληλου τύπου, εμφανίζεται ένα NumberFormatException. Η κλάση Boolean ακολουθεί τη σύμβαση ότι οποιαδήποτε παράμετρος συμβολοσειράς δεν είναι ίση με "true" (χωρίς διάκριση πεζών-κεφαλαίων) έχει ως αποτέλεσμα τη δημιουργία ενός Boolean αντικειμένου με την τιμή false.

Μέθοδοι που σας επιτρέπουν να μετατρέψετε χαρακτήρες που αντιπροσωπεύονται σε μία από τις μορφές που υποστηρίζονται από τη γλώσσα (όπως \b, \uxxxxκ.λπ.), τιμές τύπου char και αντίστροφα δεν υπάρχουν. Για να λάβετε ένα αντικείμενο String που περιέχει έναν μόνο χαρακτήρα, απλώς καλέστε τη μέθοδο String.valueOf, μεταβιβάζοντάς της την αντίστοιχη τιμή char ως παράμετρο.

Επίσης, δεν υπάρχουν τρόποι για τη δημιουργία αναπαραστάσεων συμβολοσειρών αριθμών που καθορίζονται σε μία από τις μορφές που υποστηρίζονται από τη γλώσσα - με το μηδέν (O) στην αρχή οκταδικός αριθμός, και το πρόθεμα Οх (ή ΟΧ), που χρησιμεύει ως σημάδι δεκαεξαδικό σύστημαΥπολογισμός. Αντίθετα, οι κλάσεις περιτυλίγματος ακεραίων υποστηρίζουν εκδόσεις της μεθόδου αποκωδικοποίησης που μπορούν να μετατρέψουν συμβολοσειρές σε αριθμητικές τιμές του κατάλληλου τύπου και να κατανοήσουν ότι το αρχικό O είναι οκταδικός αριθμός και ένα από τα προθέματα Ox OR Ox είναι δεκαεξαδικός αριθμός.

Οποιαδήποτε κλάση εφαρμογής μπορεί να παρέχει υποστήριξη για τη μετατροπή των δικών της αντικειμένων σε συμβολοσειρές και αντίστροφα, εάν η δήλωσή της παρακάμπτει τη μέθοδο toString αναλόγως και παρέχει έναν ειδικό κατασκευαστή που δημιουργεί ένα αντικείμενο κλάσης με βάση τη συμβολοσειρά που μεταβιβάζεται ως παράμετρος. Έχετε επίσης τη μέθοδο String.valueOf(Object obj), η οποία επιστρέφει είτε ένα αντικείμενο συμβολοσειράς "null" (αν το obj είναι null) είτε το αποτέλεσμα της μεθόδου obj.toString. Κατηγορία χορδώνπεριέχει επαρκή αριθμό υπερφορτώσεων της μεθόδου valueOf που σας επιτρέπουν να μετατρέψετε οποιαδήποτε τιμή οποιουδήποτε τύπου σε αντικείμενο String χρησιμοποιώντας απλή κλήση valueOf με τη μετάδοση του απαιτούμενου ορίσματος.

Ο προηγούμενος ομιλητής περιέγραψε τον καθοδικό μετασχηματισμό αρκετά πλήρως, αλλά ο ανοδικός μετασχηματισμός (κατά τη γνώμη μου) απαιτεί πρόσθετη εξήγηση, καθώς η ερώτηση είναι πολύ δημοφιλής και ενδιαφέρουσα.

Πώς λειτουργεί η χύτευση σαφούς τύπου

Το παράδειγμά σας δείχνει έναν ανοδικό μετασχηματισμό ( Upcasting):

List coll = new ArrayList();

Μεταφράζεται στα ρωσικά ως εξής: δημιουργήστε ένα κοράκι, σαν πουλί. Δημιουργήστε έναν δυναμικό πίνακα, όπως ένα φύλλο. Στις περισσότερες περιπτώσεις, μια ανοδική μετατροπή είναι εντελώς περιττή.
Ωστόσο, το casting τύπου λειτουργεί στις συνεντεύξεις όταν σας δίνονται ερωτήσεις κληρονομιάς. Για παράδειγμα, ο ιστότοπος quizful.net περιέχει γενικά πολλές ερωτήσεις σχετικά με τη χύτευση τύπου. Επομένως, θα εξηγήσω τα χαρακτηριστικά που γνωρίζω.

Έτσι, στο παραπάνω παράδειγμα, δημιουργήσαμε ένα αντικείμενο τύπου ArrayList και μια αναφορά τύπου List. Θυμηθείτε τα αξιώματα για αυτήν τη μέθοδο:

1. Ο σύνδεσμος μπορεί να υποδειχθεί σε οποιονδήποτε γονέα. Ακόμη και πολύ καιρό πριν. Δηλαδή, μπορείτε να ρίξετε μια αναφορά coll ακόμη και στον τύπο Object. Ο μεταγλωττιστής θα παραλείψει οποιαδήποτε αναφορά σε μια γονική κλάση, ή γονέα-γονέα ή γονέα-γονέα...γονέα

2. Κατά την πρόσβαση σε ένα πεδίο, επιστρέφεται πάντα το πεδίο αναφοράς, όχι το πεδίο αντικειμένου. Εάν δεν υπάρχει τέτοιο πεδίο στην κλάση αναφοράς, θα υπάρχει σφάλμα μεταγλώττισης.

Κλάση A( int x = 2; //Πεδίο γονέα) Η κλάση B επεκτείνει την A ( int x = 3; //Πεδίο που πρέπει να επικαλύπτει το γονικό int y = 5; //Πεδίο που δεν ανήκει στη γονική κλάση. ) Δοκιμή τάξης ( δημόσιο static void main (String args) ( A ab = new B(); //Upward conversion System.out.println("Int x = " + ab.x); ) )

Θα επιστρέψει Int x = 2 . Εάν προσπαθήσετε να αποκτήσετε πρόσβαση σε ένα πεδίο ενός αντικειμένου:

System.out.println("Int y = " + ab.y); //Σφάλμα μεταγλώττισης

Ο μεταγλωττιστής σας θα πει ότι κάνετε λάθος, αφού δεν βλέπει τέτοιο πεδίο στον σύνδεσμο (A ab). Όλα τα παραπάνω ισχύουν ακόμη και αν επισημάνετε τα πεδία σας με στατικούς τροποποιητές.

3. Κλήση μη στατικής μεθόδου: σε αυτήν την περίπτωση, θα επιστραφεί η μέθοδος του αντικειμένου. Αλλά κατά την πρόσβαση σε μια στατική μέθοδο, επιστρέφει τη μέθοδο αναφοράς.

Κλάση D( public void doSome())( //Μη στατική μέθοδος System.out.println("Μη στατικό doSome από το D"); ) δημόσιο στατικό κενό Action())( //Στατική μέθοδος System.out.println("στατική ενέργεια από το D "); ) ) η δημόσια κλάση Okey επεκτείνεται D( public void doSome())( System.out.println("doSome from Okey"); ) public static void Action())( System.out.println("static Ενέργεια από το Okey"); ) δημόσιο στατικό κενό main(String args) (D o=new Okey(); o.doSome(); //Από την κλάση Okey o.Action(); //Από την κλάση D ) )

Μη στατικό doSome από την Okey

στατική δράση από το Δ

Η λύση είναι απλή, μια μη στατική μέθοδος είναι μια μέθοδος αντικειμένου, μια στατική μέθοδος είναι μια μέθοδος κλάσης. Όταν καλούμε μια μη στατική μέθοδο, ο μεταγλωττιστής καταλαβαίνει αυτό: πετάξτε σαν κοράκι. Όταν λέμε στατικό - κυριολεκτικά, πετάξτε σαν πουλί.

4. Εάν υπάρχει κλήση σε μια μέθοδο που περιγράφεται στην κλάση αντικειμένου, αλλά δεν περιγράφεται στην κλάση αναφοράς, θα προκύψει σφάλμα μεταγλώττισης. Επειδή η μέθοδος καλείται με αναφορά:

Κλάση Α () Η κλάση Β επεκτείνει το A ( void someMethod())( public static void main(String args) ( A ab = new B(); ab.someMethod(); //Σφάλμα μεταγλώττισης. ) )

5. Ο κατασκευαστής αντικειμένων (όταν δημιουργείται με τη νέα εντολή) λειτουργεί το ίδιο σαν να δίνατε έναν σύνδεσμο στην κλάση σας.

Αυτό είναι ένα αρκετά μεγάλο θέμα, αλλά θα προσπαθήσουμε να το εξετάσουμε όσο το δυνατόν πληρέστερα και ταυτόχρονα συμπαγή. Έχουμε ήδη αγγίξει εν μέρει αυτό το θέμα όταν εξετάσαμε τους πρωτόγονους τύπους Java.

Στην Java, είναι δυνατές οι μετατροπές μεταξύ ακέραιων και τιμών κινητής υποδιαστολής. Επιπλέον, μπορείτε να μετατρέψετε ακέραιες τιμές και τιμές κινητής υποδιαστολής σε τιμές χαρακτήρες και αντίστροφα, καθώς κάθε χαρακτήρας αντιστοιχεί σε ένα ψηφίο στο Κωδικοποίηση Unicode. Στην πραγματικότητα, ο boolean τύπος είναι ο μόνος πρωτόγονος τύπος στην Java που δεν μπορεί να μετατραπεί σε άλλο πρωτόγονου τύπου. Επιπλέον, οποιοσδήποτε άλλος πρωτόγονος τύπος δεν μπορεί να μετατραπεί σε boolean.

Υπάρχουν δύο τύποι μετατροπής τύπων στην Java: σιωπηρήΚαι σαφής.

Μετατροπή σιωπηρού τύπουεκτελείται εάν πληρούνται οι ακόλουθες προϋποθέσεις:

  1. Και οι δύο τύποι είναι συμβατοί
  2. Το μήκος του τύπου στόχου είναι μεγαλύτερο ή ίσο με το μήκος του τύπου πηγής

Σε όλες τις άλλες περιπτώσεις θα πρέπει να χρησιμοποιείται μετατροπή ρητού τύπου.

Υπάρχουν επίσης δύο τύποι μετασχηματισμών:

  1. Διεύρυνση μετατροπής
  2. Περιοριστική μετατροπή

Επέκταση μετασχηματισμού ( διευρυνόμενη μετατροπή) εμφανίζεται όταν μια τιμή ενός τύπου μετατρέπεται σε έναν ευρύτερο τύπο, με μεγαλύτερο εύρος αποδεκτές τιμές. Η Java εκτελεί αυτόματα διευρυνόμενες μετατροπές, για παράδειγμα, εάν αντιστοιχίσετε ένα int literal σε μια διπλή μεταβλητή ή την τιμή μιας μεταβλητής char σε μια μεταβλητή int. Η σιωπηρή μετατροπή έχει πάντα έναν τύπο επέκτασης.

Αλλά αυτό μπορεί να έχει τις δικές του μικρές τσουγκράνες. Για παράδειγμα, εάν μια τιμή int μετατραπεί σε τιμή float. Και η τιμή int στη δυαδική αναπαράσταση έχει περισσότερα από 23 σημαντικά bit, τότε είναι δυνατή η απώλεια ακρίβειας, καθώς ο τύπος float έχει 23 bit που έχουν εκχωρηθεί για το ακέραιο τμήμα. Όλα τα χαμηλά bitsΟι τιμές int που δεν χωρούν στα 23 bit του float mantissa θα απορριφθούν, οπότε παρόλο που η σειρά του αριθμού θα διατηρηθεί, η ακρίβεια θα χαθεί. Το ίδιο ισχύει και για τη μετατροπή ενός μακρού τύπου σε διπλό.

Η επέκταση της μετατροπής τύπων Java μπορεί επίσης να απεικονιστεί ως εξής:

Οι συμπαγείς γραμμές υποδεικνύουν μετασχηματισμούς που πραγματοποιήθηκαν χωρίς απώλεια δεδομένων. Οι διακεκομμένες γραμμές υποδεικνύουν ότι μπορεί να συμβεί απώλεια ακρίβειας κατά τη μετατροπή.

Αξίζει να εξηγήσουμε λίγο γιατί, για παράδειγμα, ο τύπος byte δεν μετατρέπεται αυτόματα (όχι ρητά) στον τύπο char, αν και ο τύπος byte έχει πλάτος 8 bit και ο χαρακτήρας είναι 16, το ίδιο ισχύει και για τη μετατροπή του ο σύντομος τύπος να χαρακ. Αυτό συμβαίνει επειδή το byte και το short είναι υπογεγραμμένοι τύποι δεδομένων και ο χαρακτήρας δεν είναι υπογεγραμμένος. Επομένως, σε αυτήν την περίπτωση, πρέπει να χρησιμοποιήσετε ένα cast ρητού τύπου, καθώς ο μεταγλωττιστής πρέπει να υποδεικνύει ρητά ότι γνωρίζετε τι θέλετε και πώς θα υποβληθεί σε επεξεργασία το bit πρόσημου του byte και των τύπων σύντομων τύπων κατά τη μετατροπή στον τύπο char.

Η συμπεριφορά μιας τιμής char είναι στις περισσότερες περιπτώσεις η ίδια με τη συμπεριφορά μιας τιμής ακέραιου τύπου, επομένως, μια τιμή char μπορεί να χρησιμοποιηθεί όπου απαιτείται μια τιμή int ή long. Ωστόσο, θυμηθείτε ότι ο τύπος χαρακτήρων δεν είναι υπογεγραμμένος, επομένως συμπεριφέρεται διαφορετικά από τον σύντομο τύπο, παρόλο που και οι δύο τύποι έχουν εύρος 16 bit.

μικρός μικρό = ( μικρός ) 0xffff; // Αυτά τα bit αντιπροσωπεύουν τον αριθμό –1
απανθρακώνω ντο = "\uffff"; // Τα ίδια bit αντιπροσωπεύουν τον χαρακτήρα unicode
ενθ i1 = μικρό; // Η μετατροπή short σε int δίνει –1
ενθ i2 = ντο; // Η μετατροπή char σε int δίνει 65535

Στενικός μετασχηματισμός ( περιοριστική μετατροπή) εμφανίζεται όταν μια τιμή μετατρέπεται σε μια τιμή ενός τύπου του οποίου το εύρος δεν είναι μεγαλύτερο από το αρχικό. Ο περιορισμός των μετατροπών δεν είναι πάντα ασφαλής: για παράδειγμα, η μετατροπή της ακέραιας τιμής 13 σε ένα byte είναι λογική, αλλά η μετατροπή του 13000 σε ένα byte δεν είναι σοφή, καθώς το byte μπορεί να αποθηκεύσει μόνο τους αριθμούς −128 έως 127. Επειδή τα δεδομένα ενδέχεται να χαθούν κατά τη διάρκεια μιας στένωσης μετατροπής, ο μεταγλωττιστής Java αντιτίθεται σε οποιαδήποτε τέτοια μετατροπή, ακόμα κι αν η τιμή που μετατρέπεται εμπίπτει σε ένα στενότερο εύρος του καθορισμένου τύπου:

ενθ Εγώ = 13 ;
ψηφιόλεξη σι = Εγώ ; // Ο μεταγλωττιστής δεν θα επιτρέψει αυτήν την έκφραση

Η μόνη εξαίρεση στον κανόνα είναι όταν εκχωρείτε ένα ολόκληρο literal (μια τιμή int) σε ένα byte ή μια σύντομη μεταβλητή εάν το literal ταιριάζει με το εύρος της μεταβλητής.

Μια περιοριστική μετατροπή είναι πάντα μια μετατροπή ρητού τύπου.

Ρητή μετατροπή πρωτόγονων τύπων

Ο χειριστής της μετατροπής ρητού τύπου, ή πιο συγκεκριμένα, του τύπου χύτευσης, είναι η χρήση παρενθέσεων, μέσα στις οποίες υποδεικνύεται ο τύπος στον οποίο πραγματοποιείται η μετατροπή - (τύπος). Για παράδειγμα:

ενθ Εγώ = 13 ;
ψηφιόλεξη σι = ( ψηφιόλεξη ) Εγώ ; // Αναγκαστική μετατροπή από int σε byte
Εγώ = ( ενθ ) 13.456 ; // Αναγκαστική μετατροπή του διπλού κυριολεκτικού σε int 13

Η χύτευση πρωτόγονου τύπου χρησιμοποιείται συχνότερα για να μετατρέψετε τιμές κινητής υποδιαστολής σε ακέραιους αριθμούς. Εν το κλασματικό μέρος της τιμής κινητής υποδιαστολής απλώς απορρίπτεται(δηλαδή, η τιμή κινητής υποδιαστολής στρογγυλοποιείται προς το μηδέν και όχι προς τον πλησιέστερο ακέραιο). Ουσιαστικά λαμβάνεται μόνο το ακέραιο μέρος πραγματικός τύπος και έχει ήδη μεταδοθεί στον ακέραιο τύπο προορισμού.

Όταν φέρνετε ένα πιο ευρύχωρο ολόκληρου τύπουστο λιγότερο ευρύχωρο, τα πιο σημαντικά κομμάτια απλώς απορρίπτονται. Ουσιαστικά, αυτό ισοδυναμεί με τη λειτουργία της διαίρεσης του modulo της τιμής που μειώνεται κατά το εύρος του τύπου στόχου (για παράδειγμα, για τον τύπο byte είναι 256).

Πολύ μεγάλο ένας κλασματικός αριθμόςόταν μεταδίδεται σε έναν ακέραιο γίνεται MAX_VALUE ή MIN_VALUE.

Πολύ μεγάλο διπλόόταν φέρεται σε φλοτέρμετατρέπεται σε Float.POSITIVE_INFINITY ή Float.NEGATIVE_INFINITY.

Ο παρακάτω πίνακας είναι ένα πλέγμα όπου, για κάθε πρωτόγονο τύπο, υποδεικνύονται οι τύποι στους οποίους μπορούν να μετατραπούν και η μέθοδος μετατροπής. Γράμμα Νστον πίνακα σημαίνει ότι η μετατροπή δεν είναι δυνατή. Γράμμα Υσημαίνει έναν επεκτεινόμενο μετασχηματισμό που εκτελείται αυτόματα. Γράμμα ΜΕσημαίνει έναν περιορισμένο μετασχηματισμό που απαιτεί ένα ρητό καστ. Τελικά, Υ*σημαίνει έναν αυτόματο μετασχηματισμό διεύρυνσης, κατά τον οποίο η τιμή μπορεί να χάσει μερικά από τα λιγότερο σημαντικά ψηφία της. Αυτό μπορεί να συμβεί κατά τη μετατροπή ενός int ή long σε float ή double. Οι τύποι κινητής υποδιαστολής έχουν μεγαλύτερη εμβέλειααπό τους τύπους ακέραιων αριθμών, οπότε το int ή το long μπορεί να αναπαρασταθεί με float ή double. Ωστόσο, οι τύποι κινητής υποδιαστολής είναι προσεγγίσεις αριθμών και μπορεί να μην περιέχουν πάντα τόσα σημαντικά ψηφία στη μάντισσα όσο ακέραιους τύπους.

Αυτόματη επέκταση τύπου σε εκφράσεις

Αξίζει επίσης να αναφερθεί για άλλη μια φορά για την αυτόματη προώθηση (επέκταση) τύπων σε εκφράσεις. Αυτό το έχουμε ήδη συναντήσει όταν κοιτάξαμε ακέραιους τύπουςδεδομένα και λειτουργίες σε αυτά, αλλά αξίζει να το υπενθυμίσουμε εδώ για να το κατανοήσετε ακόμα καλύτερα και, επιπλέον, σχετίζεται άμεσα με αυτό το θέμα. Στο παράδειγμα κάτω από το σημάδι @ + , , * , / και ούτω καθεξής.

Δηλαδή όλα τα ακέραια κυριολεκτικά σε εκφράσεις, καθώς και τύπους ψηφιόλεξη, μικρόςΚαι απανθρακώνωεπέκταση σε ενθ . Εκτός εάν, όπως περιγράφεται παραπάνω, υπάρχουν άλλοι, μεγαλύτεροι τύποι δεδομένων στην έκφραση ( μακρύς, φλοτέρή διπλό). Επομένως το παραπάνω παράδειγμα θα προκαλέσει σφάλμα μεταγλώττισης επειδή η μεταβλητή ντοέχει τύπο ψηφιόλεξη, και η έκφραση b+1, ως αποτέλεσμα αυτόματης προώθησης, έχει τον τύπο ενθ.

Χύτευση σιωπηρού τύπου σε μικτές εκφράσεις ανάθεσης

Αν και αυτός ο τομέαςκαι αναφέρεται σε σιωπηρή μετατροπή(casting) τύπους, δώσαμε την εξήγησή του εδώ, αφού και σε αυτή την περίπτωση λειτουργεί το ίδιο αυτόματη επέκτασητύπους σε εκφράσεις και, στη συνέχεια, χύτευση σιωπηρού τύπου. Αυτό είναι το σώμα του μπαλέτου. Νομίζω ότι το παρακάτω παράδειγμα θα ξεκαθαρίσει τα πάντα. Όπως και στην προηγούμενη εξήγηση, το σημάδι @ σημαίνει οποιονδήποτε έγκυρο χειριστή, για παράδειγμα + , , * , / και ούτω καθεξής.

Αυτό αξίζει να εξηγηθεί με ένα απλό παράδειγμα:

ψηφιόλεξη β2 = 50 ;
β2 = β2 * 2 ; // δεν θα μεταγλωττιστεί
β2 *= 2 ; //μεταγλωττίζει, αν και ισοδυναμεί με b2 = b2 * 2

Η δεύτερη γραμμή που δίνεται στο παράδειγμα δεν μεταγλωττίζεται λόγω αυτόματης επέκτασης τύπου στις εκφράσεις, αφού η έκφραση b2*2 είναι τύπου int, αφού συμβαίνει αυτόματη επέκταση τύπου (τα ακέραια γράμματα στην έκφραση είναι πάντα int). Η τρίτη γραμμή θα μεταγλωττιστεί εύκολα, αφού το σιωπηρό casting στη συνδυασμένη έκφραση ανάθεσης θα λειτουργήσει σε αυτήν.

Boxing/unboxing - μετατροπή πρωτόγονων τύπων σε αντικείμενα περιτυλίγματος

Η πυγμαχία και το unboxing είναι επίσης ένα αρκετά μεγάλο θέμα, αλλά είναι αρκετά απλό.

Ουσιαστικά Το boxing και το unboxing είναι μετατροπές από πρωτόγονους τύπους σε αντικείμενα περιτυλίγματος και πίσω.

Για αντικείμενα περιτυλίγματος πρωτόγονων τύπων ισχύουν όλα όσα ειπώθηκαν παραπάνω.

Οι κατηγορίες περιτυλίγματος αναφέρθηκαν στους πίνακες κατά την ανάλυση καθενός από τους πρωτόγονους τύπους. Αλλά τότε ήταν μόνο μια αναφορά στον πίνακα.

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

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

Επιτρέψτε μου να σας δώσω ένα απλό παράδειγμα:

ενθ i3 ;
ψηφιόλεξη β2 = 3 ;
Ψηφιόλεξη myB ;
myB= β2;
myB++;
β2= myB;
i3= myB;

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

Κάθε έκφραση στην Java έχει έναν τύπο, ο οποίος καθορίζεται από τη δομή της έκφρασης και τους τύπους των τελεστών που την αποτελούν (σταθερές, μεταβλητές και μεθόδους). Ωστόσο, μερικές φορές μπορεί να χρειαστεί να μετατρέψουμε ρητά μια έκφραση σε άλλο τύπο. Επιπλέον, σε ορισμένες περιπτώσεις το ίδιο το σύστημα χρόνου εκτέλεσης Java εκτελεί έμμεσα τέτοιες μετατροπές.

Μετατροπή τύπουΤο Τ 1 έως τον τύπο Τ 2 επιτρέπει σε μια έκφραση του τύπου Τ 1 να αντιμετωπιστεί κατά το χρόνο μεταγλώττισης ως έκφραση του τύπου Τ 2 . Σε ορισμένες περιπτώσεις πρόκειται για μια καθαρά συντακτική κατασκευή που δεν επηρεάζει τον κώδικα που δημιουργείται, σε άλλες μια μετατροπή τύπου απαιτεί πρόσθετες ενέργειεςκατά την εκτέλεση για αλλαγή της τιμής μιας έκφρασης ή πρόσθετοι έλεγχοι για την ορθότητα του εφαρμοσμένου μετασχηματισμού. Παραδείγματα:

  • Μετατροπή τύπου ενθσε τύπο μακρύςαπαιτεί επέκταση του πρόσημου μιας ακέραιας τιμής 32-bit σε έναν ακέραιο αριθμό 64-bit κατά την εκτέλεση του προγράμματος. Δεν υπάρχει απώλεια πληροφοριών.
  • Μετατροπή τύπου φλοτέρσε τύπο μακρύςαπαιτεί μια μη τετριμμένη μετατροπή από μια κινητή τιμή 32-bit σε έναν ακέραιο αριθμό 64-bit κατά την εκτέλεση του προγράμματος. Ανάλογα με την αρχική τιμή, μπορεί να συμβεί απώλεια πληροφοριών ή όχι.
  • Η μετατροπή ενός τύπου Thread σε τύπο Object δεν απαιτεί καμία ενέργεια: Επειδή η κλάση Thread είναι απόγονος της κλάσης Object, οποιαδήποτε αναφορά σε ένα αντικείμενο του τύπου Thread είναι αυτόματα αναφορά σε ένα αντικείμενο του τύπου Object .
  • Η μετατροπή από τύπο αντικειμένου σε τύπο νήματος απαιτεί έλεγχο κατά το χρόνο εκτέλεσης. Εάν η αναφορά που μετατρέπεται είναι πράγματι μια αναφορά σε ένα αντικείμενο τύπου Thread, τότε επιστρέφεται ως αποτέλεσμα της μετατροπής, διαφορετικά δημιουργείται μια εξαίρεση.

5.4.1.1. Διευρυνόμενοι μετασχηματισμοί αριθμών

Διευρυνόμενοι μετασχηματισμοί αριθμώναυτές είναι μετατροπές αριθμητικού τύπου σε "μεγαλύτερο" αριθμητικός τύπος, τα οποία θεωρούνται ασφαλή γιατί δεν οδηγούν σε απώλεια της αξίας της μετατρεπόμενης αξίας. Τέτοιες μετατροπές στην Java είναι:

  • μεταμόρφωση ψηφιόλεξη V μικρός, ενθ, μακρύς, φλοτέρΚαι διπλό;
  • μεταμόρφωση μικρός V ενθ, μακρύς, φλοτέρΚαι διπλό;
  • μεταμόρφωση απανθρακώνω V ενθ, μακρύς, φλοτέρΚαι διπλό;
  • μεταμόρφωση ενθ V μακρύς, φλοτέρΚαι διπλό;
  • μεταμόρφωση μακρύς V φλοτέρΚαι διπλό;
  • μεταμόρφωση φλοτέρ V διπλό.

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

Δοκιμή τάξης (δημόσιο στατικό κενό main (String args) ( int bigNumber = 1234567890; float approximate = bigNumber; System.out.println (κατά προσέγγιση); ) )

θα εμφανίσει τη συμβολοσειρά 1234567936. Αυτό οφείλεται στο γεγονός ότι κατά τη μετατροπή ενθ V φλοτέρη τιμή που προκύπτει είναι 1,2345679E9 λόγω του γεγονότος ότι η μάντισσα αριθμών όπως φλοτέρκρατάει μόνο 8 δεκαδικά ψηφία(εδώ για σωστή λειτουργίαπρέπει να χρησιμοποιηθεί μετατροπή τύπου διπλό). Ωστόσο, το σύστημα χρόνου εκτέλεσης δεν δημιουργεί ποτέ σφάλματα κατά την εκτέλεση αυτών των μετασχηματισμών.

5.4.1.2. Περιορισμός αριθμών μετατροπών

Περιορισμός αριθμών μετατροπώνΠρόκειται για μετατροπές από έναν αριθμητικό τύπο σε έναν "μικρότερο" αριθμητικό τύπο, που μπορεί να οδηγήσει σε απώλεια μεγέθους και σε απώλεια ακρίβειας. Τέτοιες μετατροπές στην Java είναι:

  • μεταμόρφωση ψηφιόλεξη V απανθρακώνω;
  • μεταμόρφωση μικρός V ψηφιόλεξηΚαι απανθρακώνω;
  • μεταμόρφωση ενθ V ψηφιόλεξη, μικρόςΚαι απανθρακώνω;
  • μεταμόρφωση μακρύς V ψηφιόλεξη, μικρός, ενθΚαι απανθρακώνω;
  • μεταμόρφωση φλοτέρ V ψηφιόλεξη, μικρός, ενθ, μακρύςΚαι απανθρακώνω;
  • μεταμόρφωση διπλό V ψηφιόλεξη, μικρός, ενθ, μακρύς, φλοτέρΚαι απανθρακώνω;

Δεν θα εξετάσουμε εδώ λεπτομερώς τους κανόνες με τους οποίους συμβαίνουν αυτοί οι μετασχηματισμοί, καθώς είναι διαισθητικά σαφείς, αλλά τυπικά αρκετά δυσκίνητοι. Κατά τη χρήση τους, είναι σημαντικό να θυμάστε ότι η Java, σε αντίθεση με άλλες γλώσσες, δεν δημιουργεί σφάλματα κατά την υπερχείλιση ή την υπερχείλιση, επομένως ο έλεγχος της ορθότητας των μετασχηματισμών πέφτει εξ ολοκλήρου στον προγραμματιστή.

5.4.1.3. Επέκταση μετασχηματισμών συνδέσμων

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

  • μετατροπή οποιασδήποτε κλάσης ή διεπαφής στον πρόγονό της (ιδίως στον τύπο Αντικειμένου).
  • μετατροπή μιας κλάσης στη διεπαφή που υλοποιεί·
  • μετατροπή οποιουδήποτε πίνακα σε τύπο αντικειμένου ή τύπο Cloneable.
  • Η μετατροπή ενός πίνακα τύπου S σε πίνακα τύπου T εάν τα S και T είναι τύποι αναφοράς και η μετατροπή S σε T διευρύνεται.
  • Μετατροπή μηδενικού τύπου σε οποιονδήποτε τύπο αναφοράς.

5.4.1.4. Μετασχηματισμοί στενών συνδέσμων

Μετασχηματισμοί στενών συνδέσμωνΠρόκειται για μετατροπές παραγόμενων τύπων αναφοράς σε τύπους των απογόνων τους. Αυτές οι μετατροπές απαιτούν επικύρωση χρόνου εκτέλεσης της νομιμότητάς τους και ενδέχεται να δημιουργήσουν ένα ClassCastException. Τέτοιες μετατροπές στην Java είναι:

  • μετατροπή οποιασδήποτε κλάσης στον απόγονό της (συγκεκριμένα, μετατροπή του τύπου Object σε οποιαδήποτε άλλη κλάση).
  • μετατροπή μιας κλάσης σε διεπαφή όταν η κλάση δεν είναι τελική και δεν υλοποιεί τη διεπαφή (ιδίως, μετατροπή του τύπου αντικειμένου σε οποιαδήποτε διεπαφή).
  • μετατροπή του τύπου αντικειμένου σε οποιονδήποτε πίνακα.
  • μετατροπή οποιασδήποτε διεπαφής σε κλάση που δεν είναι τελική.
  • μετατροπή οποιασδήποτε διεπαφής σε μια κλάση που είναι τελική και υλοποιεί αυτήν τη διεπαφή.
  • μετατροπή της διεπαφής J σε διασύνδεση K όταν ο J δεν είναι παιδί του K και δεν υπάρχει μέθοδος που δηλώνεται τόσο στο J όσο και στο K με την ίδια υπογραφή, αλλά ΔΙΑΦΟΡΕΤΙΚΟΙ ΤΥΠΟΙαποτέλεσμα;
  • η μετατροπή ενός πίνακα τύπου S σε πίνακα τύπου T εάν τα S και T είναι τύποι αναφοράς και η μετατροπή S σε T στενεύει.

5.4.1.5. Μετατροπές σε χορδές

Οποιαδήποτε έκφραση σε Java, συμπεριλαμβανομένων μηδενικό, μπορεί να μετατραπεί σε τύπο συμβολοσειράς.

5.4.1.6. Μη έγκυρες μετατροπές

Οι ακόλουθες μετατροπές τύπων απαγορεύονται στην Java:

  • μετατροπή οποιουδήποτε τύπου αναφοράς σε οποιονδήποτε πρωτόγονο τύπο.
  • μετατροπή οποιουδήποτε πρωτόγονου τύπου σε οποιονδήποτε τύπο αναφοράς εκτός από το String.
  • μετατροπή ενός μηδενικού τύπου σε οποιονδήποτε πρωτόγονο τύπο.
  • μετατροπή σε μηδενικό τύπο ή τύπο boolean;
  • μετατροπές τύπων booleanσε οποιονδήποτε τύπο εκτός από το String ;
  • μετατροπή μιας κλάσης σε άλλη εάν καμία δεν είναι πρόγονος της άλλης (εκτός από τη μετατροπή σε String).
  • μετατροπή μιας κλάσης σε διεπαφή εάν η κλάση είναι τελική και δεν υλοποιείται αυτή τη διεπαφή;
  • μετατροπή μιας κλάσης σε πίνακα εάν η κλάση είναι διαφορετική από το αντικείμενο.
  • μετατροπή μιας διεπαφής σε μια κλάση που είναι τελική και δεν υλοποιεί τη δεδομένη διεπαφή (εκτός από τη μετατροπή σε τύπο συμβολοσειράς).
  • μετατροπή της διεπαφής J σε διασύνδεση K εάν υπάρχει μια μέθοδος που δηλώνεται τόσο στο J όσο και στο K με την ίδια υπογραφή αλλά διαφορετικούς τύπους αποτελεσμάτων.
  • μετατροπή ενός πίνακα σε κλάση διαφορετική από το Object και το String.
  • μετατροπή ενός πίνακα σε διεπαφή που δεν μπορεί να κλωνοποιηθεί.
  • η μετατροπή ενός πίνακα τύπου S σε πίνακα τύπου T εάν η μετατροπή S σε T είναι παράνομη

5.4.2. Μετασχηματιστικά πλαίσια

5.4.2.1. Μετατροπή κατόπιν αποστολής

Μετατροπή κατόπιν αποστολήςεμφανίζεται όταν η τιμή μιας έκφρασης εκχωρείται σε μια μεταβλητή. Σε αυτήν την περίπτωση, ο τύπος της έκφρασης μετατρέπεται στον τύπο της μεταβλητής. Κατά την εκχώρηση, είναι πάντα δυνατές οι διευρυνόμενες μετατροπές τύπων (τόσο αριθμητικών όσο και αναφοράς). Ένας περιορισμένος μετασχηματισμός είναι δυνατός μόνο εάν πληρούνται οι ακόλουθες προϋποθέσεις:

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

Για παράδειγμα, ο τελεστής byte x = 123; αποδεκτό, αφού η σταθερά 123 (τύπου ενθ) βρίσκεται εντός του εύρους των αποδεκτών τιμών του τύπου ψηφιόλεξη.

Εάν ο τύπος μιας έκφρασης δεν μπορεί να μετατραπεί σε τύπο μεταβλητής, ο μεταγλωττιστής δημιουργεί ένα σφάλμα. Σε άλλες περιπτώσεις λέμε ότι το είδος της έκφρασης συμβατή ανάθεσημε τον τύπο της μεταβλητής. Λοιπόν, το επόμενο κομμάτι

Σύντομο s = 123; char c = s; // δημιουργεί ένα σφάλμα μεταγλώττισης

θα δημιουργήσει ένα σφάλμα επειδή τύπους απανθρακώνωΚαι μικρόςείναι ασύμβατες οι εκχωρήσεις σύμφωνα με τους ορισμούς που δίνονται παραπάνω (η πρώτη υλοποιείται ως ανυπόγραφες λέξεις 16 bit και η δεύτερη ως υπογεγραμμένη).

5.4.2.2. Επιχειρήματα μεθόδου μετατροπής

Επιχειρήματα μεθόδου μετατροπήςεμφανίζεται όταν οι πραγματικές τιμές ορίσματος μετατρέπονται στον τύπο των παραμέτρων μιας μεθόδου ή ενός κατασκευαστή όταν καλείται. Σε αυτήν την περίπτωση, είναι πάντα δυνατές οι επεκτατικές μετατροπές τύπων (τόσο αριθμητικών όσο και αναφοράς) και δεν επιτρέπονται οι περιοριστικές μετατροπές. Οι λόγοι για την τελευταία απαγόρευση μπορούν να επεξηγηθούν με το ακόλουθο παράδειγμα:

Δοκιμή τάξης ( static int m(byte a, int b) ( return a + b; ) static int m(short a, short b) ( return a - b; ) public static void main (String args) ( System.out. println( m(1, 2)) // δημιουργεί ένα σφάλμα μεταγλώττισης ) )

Εδώ η κλάση Test περιέχει δύο μεθόδους με το ίδιο όνομα, οι οποίες διαφέρουν μόνο στους τύπους των παραμέτρων. Εάν επιτρέπονταν οι περιοριστικές μετατροπές ορισμών στην Java, ο χρόνος εκτέλεσης θα έπρεπε να καθορίσει σε ποιες από αυτές τις μεθόδους ισχύει η κλήση στο m(1, 2). Για να αποφευχθούν τέτοιες ασάφειες, οι προγραμματιστές γλωσσών έλυσαν το πρόβλημα ριζικά: απαγόρευσαν τέτοιες κλήσεις μεθόδων. Σε αυτήν την περίπτωση, για να καλέσουμε, για παράδειγμα, την πρώτη μέθοδο, πρέπει να υποδείξουμε ρητά τον τύπο του πρώτου τελεστή (ο δεύτερος από προεπιλογή έχει ήδη τον τύπο ενθ), δηλαδή m((byte)1, 2) .

5.4.2.3. Μετατροπή σε συμβολοσειρά

Μετατροπή σε συμβολοσειράεμφανίζεται μόνο σε μία περίπτωση: όταν η πράξη δυαδικού + εφαρμόζεται σε δύο τελεστές, ο ένας από τους οποίους είναι τύπου String. Σε αυτήν την περίπτωση, ο δεύτερος τελεστής μετατρέπεται επίσης σε τύπο String και το αποτέλεσμα της πράξης είναι μια συνένωση των συμβολοσειρών που προκύπτουν. Αυτή η διαδικασία περιγράφεται λεπτομερέστερα στο Κεφ. 5.14.

5.4.2.4. Μετατροπή ρητού τύπου

Μετατροπή ρητού τύπουΕμφανίζεται όταν μια λειτουργία τύπου cast εφαρμόζεται ρητά στον τελεστή. Σε αυτήν την περίπτωση, μπορούν να χρησιμοποιηθούν όλοι οι τύποι που περιγράφονται παραπάνω μετατροπές τύπων, εκτός από τη μετατροπή σε συμβολοσειρά. Η απόπειρα ρητής μετατροπής σε έναν τύπο που έχει επισημανθεί ως απαγορευμένος παραπάνω θα προκαλέσει σφάλμα μεταγλώττισης. Επιπλέον, μπορεί να δημιουργηθεί ένα ClassCastException κατά το χρόνο εκτέλεσης, εάν η καθορισμένη μετατροπή δεν είναι έγκυρη.

5.4.3. Αριθμητικές μετατροπές τύπου τελεστών

Μετατροπή τύπου κατά την αξιολόγηση αριθμητικές εκφράσειςέχει μια σειρά από χαρακτηριστικά. Καταλήγουν σε δύο περιπτώσεις: μετατροπή τελεστών σε μοναδικές πράξεις και σε δυαδικές πράξεις.

Πριν εκτελέσετε μια ενιαία λειτουργία:

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

Πριν εκτελέσετε μια δυαδική λειτουργία:

  • αν ένας από τους τελεστές είναι τύπου διπλό, τότε το δεύτερο μετατρέπεται επίσης σε τύπο διπλό;
  • φλοτέρ, τότε το δεύτερο μετατρέπεται επίσης σε τύπο φλοτέρ;
  • Διαφορετικά, εάν ένας από τους τελεστές είναι τύπου μακρύς, τότε το δεύτερο μετατρέπεται επίσης σε τύπο μακρύς;
  • Διαφορετικά, και οι δύο τελεστές μετατρέπονται σε πληκτρολόγηση ενθ.