2014-04-23 1 views
1

Je lisais un programme et a vu la syntaxe suivante:Que signifie un nom de type entre parenthèses?

Pet pet1 = (Pet) objIn.readObject(); 

Pet est une classe abstraite, objIn.readObjet() signifie lecture des objets à partir du fichier, mais qu'est-ce que la syntaxe (Pet) signifie?

Définit-il chaque objet lu dans le fichier comme un nouvel objet Pet? Mais Pet est une classe abstraite, comment pouvez-vous définir un objet en elle?

+1

Pour être précis: '(' et ')' sont appelées parenthèses. Les parenthèses sont '[' et ']' –

Répondre

4
objIn.readObject(); 

Renvoie une référence de type Object. Vous ne pouvez pas affecter une référence de type Object à une référence déclarée comme type Pet. Donc, vous utilisez cette syntaxe pour cast il. Le casting change le type de quelque chose. Dans ce cas, le pointeur sur le Object existant.

Exemple

Object obj = objIn.readObject(); 

if(obj instanceof Pet) { 
    // Make sure it is of type Pet 
    Pet pet1 = (Pet)obj; 
} 

Le (Pet) indique au compilateur de se référer maintenant à cette instance comme un type de Pet.

Modifier

Je ne pouvais pas mieux dire moi-même, le commentaire de Andrzej peut aller ici:

casting indique que le type vérificateur que vous (le programmeur) avez plus d'informations sur le type réel de l'objet, qui peut être déduit du typage statique. Dans cet exemple par exemple, readObject est seulement garanti pour renvoyer un objet - mais nous pouvons dire du contexte que la valeur retournée sera réellement, en réalité, une instance de Pet.

+0

thx !! très utile – xiaopassion

+0

Je préciserais que * casting ne change pas réellement le type d'objets *. Vous ne pouvez pas l'utiliser pour * convertir * une instance d'une classe en une autre, par ex. pour transformer un 'String' (comme' "4.2" ') en un' BigDecimal'. Casting indique seulement au vérificateur de type que vous (le programmeur) avez plus d'informations sur le type réel de l'objet, que ce qui peut être déduit de la frappe statique. Dans cet exemple par exemple, 'readObject' est seulement garanti de renvoyer un' Object' - mais nous pouvons dire du contexte que la valeur retournée sera réellement, en réalité, une instance de 'Pet'. –

+0

Je pensais avoir couvert cela en disant qu'il est en train de changer le pointeur vers le 'Object' existant. Je suis d'accord cependant, cela pourrait être un peu vague. – christopher

0

Il s'agit d'un cast de type. Read this ou this. Cela signifie que vous pouvez traiter les objets comme (l'un de) leur (s) superclasse (s). En Java, chaque classe dérive de la classe Object (à l'exception des types primitifs, qui ont tous un type de référence correspondant, de toute façon). Cela signifie que je peux lancer String, ArrayList, Calendar, SimpleDateFormat ou tout autre cours auquel vous pouvez penser à Object.

+1

Je comprends ce que vous voulez dire, mais votre dernière phrase est un peu ambiguë. Il se lit presque comme 'String' pourrait être casté en' ArrayList' etc. –

+0

Haha, oh ouais je le vois aussi, je vais le changer. – Smokez

0

Mais Pet est une classe abstraite, comment peut définir un objet en elle?

Ceci concerne polymorphism. Dans les langages orientés objet tels que Java, il est possible de faire des déclarations variables comme:

class Dog extends Pet {...} 
Dog someDog = new Dog(...); 

Pet pet = someDog; // <--- polymorphism in action 

Il n'a pas en fait, si Pet est abstraite ou non. Nous stockons simplement une référence à someDog dans une variable "en forme" comme un Pet.

Nous pouvons appeler toutes les méthodes définies dans Pet sur notre variable pet, mais toutes les méthodes supplémentaires définies dans la classe Dog ne seront pas disponibles.

Questions connexes