Java génériques et la réflexion: le chargement des classes

cypherman:

Je me donne quelques classes qui me sont inconnus. Certains d'entre eux sont présentés à titre d'exemple:

class Paper {}

class Bakery {}

class Cake extends Bakery {}

class ReflexiveBaker {

  /**
   * Create bakery of the provided class.
   * 
   * @param order class of bakery to create
   * @return bakery object
   */
  public Object bake(Class order) {
    // Add implementation here
  }

}

La tâche consiste à redessiner les types de signature de la méthode si nécessaire et d'ajouter la mise en œuvre. La méthode de cuisson doit être conforme à ce qui suit:

  • Créer des objets de classe de boulangerie ou d'une sous-classe de celui-ci selon l'argument de la classe
  • Drapeau erreur de compilation si l'argument de commande ne boulangerie ou d'une sous-classe de celui-ci (par exemple, si elle est du papier ou objet)

Tout ce que j'ai essayé, je reçois une erreur: Main.java :: erreur: types incompatibles: l'objet ne peut pas être transformé en gâteau Gâteau = baker.bake (Cake.class);

Le meilleur que je suis venu avec est la suivante:

cuire au four publique d'objets (ordre de classe) throws Exception {order.getDeclaredConstructor de retour () newInstance ().

Je sais que c'est mal, mais je suis complètement coincé ici. Quelqu'un pourrait-il expliquer s'il vous plaît ce qui se passe?

Ravindra Ranwala:

Votre méthodes type de retour est java.lang.Objectet le compilateur ne peut pas se porter garant que la valeur de retour est de type à Cakemoins que vous convainquez le compilateur en ajoutant un casting explicite sans contrôle comme celui - ci.

Cake cake = (Cake) ReflexiveBaker.bake(Cake.class);

Cette fonte est sujette aux erreurs sans contrôle et maladroit. Disons que vous avez une autre classe appelée pain qui est un sous - type de Bakeryet vous passez cette instance de classe gâteau attendant que le type de retour. La déclaration ci - dessus compile encore, mais jette un ClassCastExceptionà l' exécution.

Une meilleure approche est de generify la méthode utilisant un type paramètre borné de telle sorte qu'il accepte uniquement les types de sous Bakeryet retourne le même type que le paramètre de type de l'objet de classe fourni. Voici une telle tentative.

static class ReflexiveBaker {
    public static <T extends Bakery> T bake(Class<T> order) {
        try {
            return order.getDeclaredConstructor().newInstance();
        } catch (NoSuchMethodException | InstantiationException | IllegalAccessException
                    | InvocationTargetException e) {
            throw new AssertionError("Class could not be instantiated.", e);
        }
    }
}

Je suppose que tu aimes

Origine http://10.200.1.11:23101/article/api/json?id=428602&siteId=1
conseillé
Classement