¿Hay una diferencia entre Enumeration <? extiende ZipEntry > y Enumeration <ZipEntry>? Si es así, ¿cuál es la diferencia?Diferencia entre enumeración <? extiende ZipEntry> y Enumeration <ZipEntry>?
Respuesta
No hay diferencia práctica en términos de lo que puede hacer cuando tiene uno de ellos, porque el parámetro de tipo solo se usa en una posición de "salida". Por otro lado, hay una gran diferencia en términos de lo que puede usar como uno de ellos.
Supongamos que tiene Enumeration<JarEntry>
- no pudo pasar esto a un método que tomó Enumeration<ZipEntry>
como uno de sus argumentos. Usted podría pasarlo a un método tomando Enumeration<? extends ZipEntry>
sin embargo.
Es más interesante cuando tienes un tipo que utiliza el parámetro tipo en las posiciones de entrada y salida, siendo el ejemplo más obvio el List<T>
. Aquí hay tres ejemplos de métodos con variaciones en un parámetro. En cada caso, intentaremos obtener un elemento de la lista y agregar otro.
// Very strict - only a genuine List<T> will do
public void Foo(List<T> list)
{
T element = list.get(0); // Valid
list.add(element); // Valid
}
// Lax in one way: allows any List that's a List of a type
// derived from T.
public void Foo(List<? extends T> list)
{
T element = list.get(0); // Valid
// Invalid - this could be a list of a different type.
// We don't want to add an Object to a List<String>
list.add(element);
}
// Lax in the other way: allows any List that's a List of a type
// upwards in T's inheritance hierarchy
public void Foo(List<? super T> list)
{
// Invalid - we could be asking a List<Object> for a String.
T element = list.get(0);
// Valid (assuming we get the element from somewhere)
// the list must accept a new element of type T
list.add(element);
}
Para más detalles, lea:
Sí, directamente de uno de los sun generics tutorials:
Aquí Shape es una clase abstracta con tres subclases: Círculo, Rectángulo, y Triángulo.
public void draw(List<Shape> shape) { for(Shape s: shape) { s.draw(this); } }
Vale la pena señalar que el método draw() sólo puede ser llamado en las listas de forma y no puede ser llamado en una lista del círculo, rectángulo, triángulo y para ejemplo. Con el fin de tener el método aceptar cualquier tipo de forma, debe ser escribirse como sigue:
public void draw(List<? extends Shape> shape) { // rest of the code is the same }
Esta es la segunda vez esta semana que Jon Skeet ha recibido una respuesta justo antes que yo. Propongo que nos refiramos a esto como Skeeting. – GaryF
suena bien. ¿Cuál sería el tiempo pasado? Sket? "¡Jon Skeet me trajo OTRA VEZ!" :) – Epaga
http://stackoverflow.com/questions/305223/jon-skeet-facts/317486#317486 –
Ahora se acaba de ir y me recordó algo que nos hubiera gustado más en el C# mundo .
Aparte de los enlaces proporcionados, hay algunos buenos enlaces sobre C# y Java en relación con este tema en las respuestas a esta pregunta: Logic and its application to Collections.Generic and inheritance
Una selección de las cuales son:
- Contravariance and Covariance in C# (código de es C# específico, y teórica desde la sintaxis no existe [todavía], sino que cubre los temas en general muy bien.)
- Java generics and the covariance and contravariance of arguments
- Java generics tutorial fr om Sun.
- 1. diferencia entre <%! %> y <% %>
- 2. Diferencia entre <? Php y <?
- 3. ¿Cuál es la diferencia entre <?> y <? extiende Object> en Java Generics?
- 4. Diferencia entre Java Enumeration y Iterator
- 5. Lista <? extiende Base> VS List <Base>
- 6. Tratar Enumeración <T> como Iterator <T>
- 7. ¿Cuál es la diferencia entre ofstream "<<" y Write
- 8. ¿Diferencia entre <asp:table> y <table>?
- 9. Diferencia entre <string> y <string.h>?
- 10. ¿Cuál es la diferencia entre <% %> y <%=%>?
- 11. ¿Cuál es la diferencia entre <%# %> y <%= %>?
- 12. En ASP.Net, ¿cuál es la diferencia entre <% = y <% #
- 13. Ruby - Diferencia entre Array # << y Array # push
- 14. Diferencia entre <acronym> y <abbr>?
- 15. Java Generics WildCard: <? extiende Número> vs <T extiende Número>
- 16. ¿Diferencia entre <=> y == en Ruby?
- 17. Diferencia entre clase y clase <?>
- 18. ¿Cuál es la diferencia entre <%: y <% = y <% # en aspx?
- 19. Lista <? extiende MyType>
- 20. ¿Cuál es la diferencia entre cout << cout y cout << y cout en C++?
- 21. Enum <? se extiende la interfaz>
- 22. Genéricos: T extiende MyClass vs. T extiende MyClass <T>
- 23. Diferencia entre operadores "no iguales" <> y! = En PHP
- 24. Cuál es la diferencia entre mysqlimport y mysql <dbfile.sql
- 25. Diferencia entre DictionaryBase y Dictionary <Tkey,Tvalue>
- 26. cuál es la diferencia entre '! =' Y '<>' en MySQL
- 27. ¿Hay alguna diferencia entre "! =" Y "<>" en Oracle Sql?
- 28. Diferencia entre ByteArray y Array <Byte> en kotlin
- 29. ¿Cuál es la diferencia entre `=` y `<-` en R?
- 30. ¿Cuál es la diferencia entre "<>" y "! ="?
ZipEntrySubclass como JarEntry (¿por qué ZipFile.entries usa un comodín)? –
Gracias Tom - editaré mi respuesta :) –