2016-11-11 2 views
2

Je suis en train de clarifier ce que je comprenne bien clichage. S'il vous plaît corrigez-moi sur tout ce qui est incorrect car j'ai été auto-apprentissage Java pendant environ 2 mois maintenant à un rythme très lent.type coulée/coulée vers le bas en Java

Disons que je créé une classe appelée sous-objet. Et je suis conscient que toutes les classes qui n'ont pas de superclasse explicite directe sont supposées être des sous-classes de la classe Object.

Object obj1 = new SubObject(); 
    SubObject subObj1 = (SubObject) obj1; 
    System.out.println(subObj1); //prints out com.examplePackage.SubObject1234e1234; 

J'ai donc avec succès downcasted la référence de la classe de base (Object) à sa classe dérivée (Subobject). Mais ...

Object obj2 = new Object(); 
SubObject subObj2 = (SubObject) obj2;//this throws the ClassCastException error. 

Ma compréhension de l'erreur ClassCastException est qu'il a hérité RuntimeException de l'attraper pendant la compilation, pour montrer que le code a tenté de jeter un objet à une sous-classe dont il n'est pas une instance. Parce que subObj2 n'est PAS une instance de SubObject, mais plutôt Object, il est incompatible.

J'ai donc 2 questions: 1. Y at-il défaut/erreur dans ma compréhension? 2. Dans quelle situation le downcasting est-il réellement utilisé? Merci à tous pour l'aide.

Répondre

1

La pertinence de RuntimeException est qu'il 'unchecked'. Un développeur n'est donc pas obligé de s'en occuper. L'approche normale consiste à vérifier (en utilisant une instruction if et en utilisant quelque chose comme instanceOf) pour voir si la distribution est autorisée avant d'autoriser la distribution.

Ainsi,

if(subObj2 instanceof SubObject) { 
    SubObject s2 = (SubObject) obj2; 
    ... 
} 

Cependant, cela est considéré comme une « odeur de code » - à savoir quelque chose qui est inhabituel et qui sonne la sonnette d'alarme dans l'esprit des développeurs supérieurs. En règle générale, vous devriez réaliser ce genre de chose grâce au polymorphisme, même si ce n'est pas toujours possible ou souhaitable. Pour la plupart des types de programmes, le moulage de type ne devrait pas être nécessaire la plupart du temps.

Cependant, votre pensée est généralement correcte.

0

Une situation dans laquelle la diffusion descendante peut se produire est dans le contexte du modèle de conception d'usine. Dans ce modèle de conception, les détails d'implémentation de plusieurs classes enfants peuvent être extraits en utilisant simplement leur classe parente.

Prenons l'exemple suivant:

import java.util.ArrayList; 

public class Factory { 

private ArrayList<Product> products = new ArrayList<Product>(); 

public static void main(String[] args){ 
    Factory factory = new Factory(); 

    factory.addProduct(new Ball("1")); 
    factory.addProduct(new ToyCar("2")); 
    factory.addProduct(new Dice("3")); 

    Product popProduct = factory.popProduct(); 

    Ball downcastBall = (Ball)popProduct; 

    System.out.println(downcastBall.getId()); 
} 

public void addProduct(Product prodIn){ 
    products.add(prodIn); 
} 

public Product popProduct(){ 
    Product returnProd = products.get(0); 
    products.remove(0); 
    return returnProd; 
} 
} 

Les classes Ball, toycar et dés étendent toute la classe de produits et mettre en œuvre la méthode getId() de celui-ci, de sorte que les trois enfants peuvent tous être traités comme de simples produits. C'est ce qu'on appelle un polymorphisme.

I Postez le reste du code pour pouvoir jouer avec.

La classe de balle:

public class Ball extends Product{ 

public Ball(String id) { 
    super(id); 
} 

public String getId(){ 
    return "ball!"; 
} 
} 

La classe toycar:

public class ToyCar extends Product{ 

private String ToyCarId; 

public ToyCar(String id) { 
    super(id); 

} 

public String getId(){ 
    return this.ToyCarId; 
} 
} 

La classe Dice:

public class Dice extends Product{ 

private String diceId; 

public Dice(String id) { 
    super(id); 

} 

public String getId(){ 
    return this.diceId; 
} 
} 

Et enfin la classe de produit:

public class Product { 

private String id; 

public Product(String id){ 
    this.id = id; 
} 

public String getId(){ 
    return this.id; 
} 
}