genéricos de Java y la reflexión: la carga de clases

cypherman :

Me dan algunas clases que son desconocidos para mí. Algunos de ellos se muestran como un ejemplo:

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 tarea consiste en rediseñar tipos método de firma si es necesario y para añadir la aplicación. El método de horneado debe ser conforme a lo siguiente:

  • Crear objetos de la clase de panadería o cualquier subclase de acuerdo con el argumento de clase
  • error en tiempo de compilación si la bandera no es argumento para la panadería o cualquier subclase de ella (por ejemplo, si se trata de papel u objeto)

Lo que he intentado que estoy recibiendo un error: Main.java :: error: tipos incompatibles: El objeto no se puede convertir a la torta Torta Torta = baker.bake (Cake.class);

El mejor que he llegado con esto es:

Objeto hornear pública (orden de Clase) throws Exception {order.getDeclaredConstructor retorno () newInstance (.);

Sé que está mal, pero estoy completamente atrapado aquí. Podría alguien explicar lo que está pasando?

Ravindra Ranwala:

Su tipo de métodos de retorno es java.lang.Objecty el compilador no puede dar fe de que el valor de retorno es de tipo Cakea menos que convencer al compilador mediante la adición de un reparto sin control explícito de esta manera.

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

Este molde sin control es propenso a errores y torpe. Digamos que tiene otra clase llamada Pan que es un subtipo de Bakeryy se pasa esa instancia de clase esperando pastel, así como el tipo de retorno. La declaración anterior todavía compila, pero lanza una ClassCastExceptionen tiempo de ejecución.

Un enfoque mucho mejor es generify el método que utiliza un tipo limitado de parámetros de tal manera que sólo acepta sub tipos de Bakeryy devuelve el mismo tipo que el parámetro de tipo de la clase de objeto proporcionado. He aquí uno de esos intentos.

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);
        }
    }
}

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=428874&siteId=1
Recomendado
Clasificación