es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilice Class como firma de método

En la firma del método, necesito un parámetro que sea de cualquier tipo de clase que extienda de Collection (List, Set, etc), para poder devolver cualquiera de ellos.

Para intentar lograr esto, utilicé el siguiente método:

public Collection<t> method(Class<? extends Collection> collectionType) {
    // Hacer algo...
}

Sin embargo, cuando intento usarlo de la siguiente manera:

method(List.class);

Surge el siguiente error:

Error: java: tipos incompatibles: java.lang.Class<list> no se puede convertir a java.lang.Class<java.util.collection>

Ya busqué una respuesta ya resuelta en Stackoverflow, encontrando esta publicación: https://stackoverflow.com/questions/47459073/java-class-extends-collection

Pero no me ayuda a entender el error. Creo que no estoy entendiendo el uso del comodín (?).</java.util.collection>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error que estás obteniendo se debe a que el parámetro en tu método requiere un tipo de clase que extienda de Collection, lo cual incluye tanto List como Set. Sin embargo, cuando intentas pasar List.class como argumento, no coincide con el requisito de tipo porque List no es una subclase de Collection, sino un subtipo de ella.

    Para solucionar esto, puedes cambiar el parámetro en la firma de tu método para usar un comodín con un límite superior, así:

    public <t extends=""></t><?>> T metodo(Class<t> tipoColeccion) {
       // Haz algo...
    }
    

    En este método modificado, el parámetro de tipo genérico T está limitado por Collection<?>, lo que significa que puede ser cualquier subtipo de Collection, incluyendo List y Set. Luego, puedes pasar List.class como argumento sin errores de compilación.

    metodo(List.class);
    

    La sintaxis “? extends Collection” que intentaste usar funcionaría si estuvieras devolviendo un valor de ese tipo, pero no como un parámetro, ya que restringe los tipos de clase que se pueden pasar únicamente a subclases directas de Collection, y no a subtipos.

Comments are closed.