java:type_casting

This is an old revision of the document!


Ρητές (explicit) και άρρητες (implicit) μετατροπές τύπων

Σε συνέχεια του παραδείγματος κληρονομικότητας της προηγούμενης ενότητας μπορούμε να γράψουμε

MountainBike myBike = new MountainBike();

Από την παραπάνω δήλωση η μεταβλητή myBike είναι τύπου MountainBike. Επειδή όμως ο τύπος MountainBike κληρονομεί από την μεταβλητή Bicycle η συγκεκριμένη μεταβλητή είναι και τύπου Bicycle. Επομένως θα μπορούσαμε να γράψουμε

Bicycle myBicycle = myBike;
   //ή
Βicycle yourBicycle = new MountainBike();

Την παραπάνω ανάθεση την ονομάζουμε Implicit Casting διότι αναθέτουμε μία μεταβλητή ενός τύπου δεδομένων (myBike) σε μία μεταβλητή γονικού τύπου δεδομένων (myBicycle), χωρίς type casting.

Ας δοκιμάσουμε το ανάποδο παράδειγμα τώρα

Bycycle myBicycle = new Bicycle();
MountainBike myBike = myBicycle;

Σε αυτή την περίπτωση ο compiler διαμαρτύρεται, διότι η μεταβλητή myBicycle είναι τύπου Bicycle και δεν είναι απαραίτητο ότι είναι και τύπου MountainBike. Αν θέλουμε να ξεπεράσουμε το παραπάνω πρόβλημα θα πρέπει να γράψουμε το εξής:

Bycycle myBicycle = new Bicycle();
MountainBike myBike = (MountainBike) myBicycle;

Εδώ ενημερώνουμε τον compiler ότι η μεταβλητή myBicycle είναι και τύπου MountainBike, λαμβάνοντας ο προγραμματιστής την ευθύνη ότι κάτι τέτοιο ισχύει. Εάν δεν ισχύει κάτι τέτοιο κατά την εκτέλεση του προγράμματος θα παραχθεί μία εξαίρεση (exception)*. Θα δούμε πιο κάτω τι είναι και πως διαχειριζόμαστε τις εξαιρέσεις.

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

Bycycle myBicycle = new Bicycle();
MountainBike myBike;
if (myBicycle instanceof MountainBike) {
    myBike = (MountainBike)myBicycle;
}

Κριτήρια χρήσης της κληρονομικότητας ως εργαλείο ανάπτυξης λογισμικού

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

java/type_casting.1455296887.txt.gz · Last modified: 2016/02/26 11:15 (external edit)