wildcards type parameter method lower generic bound java generics bounded-wildcard

type - java wildcard capture



¿Qué significa List<?> En java generics? (8)

¿Qué significa List<?> , Significa simplemente una lista de objetos de tipo no especificado?

Buscar en Google la cadena <?> devuelve nada útil (:


Como dijo Tom, ? el ? , o comodín ilimitado, significa que el tipo de objeto no está especificado. Podría ser desconocido, podría estar destinado a múltiples valores posibles o podría ser simplemente irrelevante. Su ejemplo, List<?> , Se pronuncia "List of unknown". Es conveniente porque es flexible, pero también presenta algunas dificultades porque no se pueden introducir objetos aleatorios y sacarlos de grupos de desconocidos con total impunidad.

Recursos:

  • Los comodines se discuten here en el tutorial de Java.
  • Hay un buen tutorial sobre genéricos en general por Angelika Langer disponible here .
  • Y hay otra buena descripción here (PDF) por Gilad Bracha; echa un vistazo a las páginas 5-7.
  • Finalmente, si puede tener acceso a Java efectivo por Josh Bloch, tiene una gran sección sobre genéricos y los casos en los que puede, no puede, debe y no debe usar comodines (capítulo 5, páginas 109-146 en la segunda edición).

Por cierto, su búsqueda en Google falló porque Google no usa caracteres especiales:

Con algunas excepciones, se ignora la puntuación (es decir, no se puede buscar @ # $% ^ & * () = + [] / y otros caracteres especiales).

- Página de ayuda de Google

(EDITAR: debo haber estado muy cansado cuando escribí esto anoche. Se limpió el formato / se agregó un poco de información).


Cuando saca un elemento de una Colección, debe convertirlo al tipo de elemento que está almacenado en la colección. Además de ser inconveniente, esto no es seguro. El compilador no verifica que tu conversión sea la misma que el tipo de la colección, por lo que el lanzamiento puede fallar en el tiempo de ejecución.

Generics le proporciona una forma de comunicar el tipo de colección al compilador, para que pueda verificarse. Una vez que el compilador conoce el tipo de elemento de la colección, el compilador puede verificar que ha utilizado la colección de forma coherente y puede insertar los moldes correctos en los valores que se extraen de la colección.

here


La palabra clave que necesita para obtener más información es Wildcards


Para responder a esta pregunta, necesito explicar los comodines ilimitados y los comodines delimitados.
El contenido de esta publicación se ha ensamblado a partir de la documentación de Java.

1. Comodines ilimitados

El tipo de comodín sin límites se especifica utilizando el carácter comodín ( ? ), Por ejemplo, List<?> . Esto se llama una lista de tipo desconocido. Hay dos escenarios en los que un comodín ilimitado es un enfoque útil:

  • Si está escribiendo un método que puede implementarse utilizando la funcionalidad provista en la clase Object.

  • Cuando el código está utilizando métodos en la clase genérica que no dependen del parámetro de tipo. Por ejemplo, List.size o List.clear . De hecho, la Class<?> Se usa con tanta frecuencia porque la mayoría de los métodos en la Class<T> no dependen de T

2. Comodines limitados

Considere una aplicación de dibujo simple que puede dibujar formas como rectángulos y círculos. Para representar estas formas dentro del programa, podría definir una jerarquía de clases como esta:

public abstract class Shape { public abstract void draw(Canvas c); } public class Circle extends Shape { private int x, y, radius; public void draw(Canvas c) { ... } } public class Rectangle extends Shape { private int x, y, width, height; public void draw(Canvas c) { ... } }

Estas clases se pueden dibujar en un lienzo:

public class Canvas { public void draw(Shape s) { s.draw(this); } }

Cualquier dibujo generalmente contendrá una cantidad de formas. Suponiendo que estén representados como una lista, sería conveniente tener un método en Canvas que los dibuje a todos:

public void drawAll(List<Shape> shapes) { for (Shape s: shapes) { s.draw(this); } }

Ahora, las reglas de tipo dicen que drawAll() solo puede drawAll() en listas de Shape exactamente: no puede, por ejemplo, ser llamado en una List<Circle> . Eso es desafortunado, ya que todo lo que hace el método es leer formas de la lista, por lo que podría ser llamado en una List<Circle> . Lo que realmente queremos es que el método acepte una lista de cualquier tipo de forma: public void drawAll (formas de lista) {...} Aquí hay una diferencia pequeña pero muy importante: hemos reemplazado el tipo List<Shape> con List<? extends Shape> List<? extends Shape> . Ahora drawAll() aceptará listas de cualquier subclase de Shape , por lo que ahora podemos llamarlo a List<Circle> si así lo queremos.

List<? extends Shape> List<? extends Shape> es un ejemplo de un comodín delimitado. El ? representa un tipo desconocido, sin embargo, en este caso, sabemos que este tipo desconocido es de hecho un subtipo de Shape. (Nota: podría ser Shape en sí, o alguna subclase, no necesita literalmente extender Shape). Decimos que Shape es el límite superior del comodín.

Del mismo modo, la sintaxis ? super T ? super T , que es un comodín delimitado, denota un tipo desconocido que es un supertipo de T. A ArrayedHeap280<? super Integer> ArrayedHeap280<? super Integer> , por ejemplo, incluye ArrayedHeap280<Integer> , ArrayedHeap280<Number> y ArrayedHeap280<Object> . Como puede ver en la documentación de java para la clase Integer , Integer es una subclase de Number que a su vez es una subclase de Object.


Parece que deberías buscar documentación sobre los genéricos de Java.

La List<?> Significa que es un objeto basado en un tipo actualmente no especificado. Esa especificación se hace cuando se crea una instancia de la clase.

Por ejemplo:

List<String> listOfStrings = new ArrayList<String>();

es una lista de objetos String.


Probablemente estás mirando la clase de List basada en plantilla. Puede crear una lista de cadenas por List<String> myList = new MyList<String>(); como ejemplo. Verifique la documentación para todos los tipos que admite. Debe admitir cualquier tipo de objeto, pero si hay una funcionalidad de ordenación, debe proporcionar algunas funciones de comparación.

Tenga en cuenta que en el ejemplo anterior, MyList es una clase concreta que implementa la interfaz List en Java. Puede ser ArrayList .

EDITAR: supuse que List era una clase concreta por error. Solucionado el error anterior. Gracias Jon.


List<?> Significa List<? extends Object> List<? extends Object> entonces en Collection<E> encontrará containsAll(Collection<?> c) que le permite escribir

List<Object> objs = Arrays.<Object>asList("one",2,3.14,4); List<Integer> ints = Arrays.asList(2,4); assert objs.containsAll(ints);//true


List es una interfaz que puede implementar usted mismo y también implementada por algunas de las colecciones de Java, como Vector .

Puede proporcionar información de escritura en tiempo de compilación utilizando los corchetes en ángulo. El tipo más genérico sería Object , que sería List<Object> . El <?> Que ves indica una Lista de alguna subclase de Object o un Object . Esto es como decir List<? extends Object> List<? extends Object> , o List<? extends Foo> List<? extends Foo> , donde la List contiene objetos de alguna subclase de Foo u objetos de Foo .

No puedes crear una instancia de una List ; es una interfaz, no una implementación.