Por favor, muestre un buen ejemplo de covarianza y contravarianza en Java.¿Demuestra covarianza y contravarianza en Java?
Respuesta
covarianza:
class Super {
Object getSomething(){}
}
class Sub extends Super {
String getSomething() {}
}
Sub # getSomething es covariante porque devuelve una subclase del tipo de retorno de Súper # getSomething (pero quedan satisfechas por el contrato de Super.getSomething())
contravarianza
class Super{
void doSomething(String parameter)
}
class Sub extends Super{
void doSomething(Object parameter)
}
Sub # doSomething es contrava riant porque toma un parámetro de una superclase del parámetro de Super # doSomething (pero, de nuevo, cumple el contrato de Super # doSomething)
Aviso: este ejemplo no funciona en Java. El compilador de Java sobrecargaría y no anularía el método doSomething(). Otros idiomas admiten este estilo de contravarianza.
Genéricos
Esto también es posible para los genéricos:
List<String> aList...
List<? extends Object> covariantList = aList;
List<? super String> contravariantList = aList;
Ahora puede acceder a todos los métodos de covariantList
que no tienen un parámetro genérico (como debe ser algo "extends Object"), pero los getters funcionarán bien (ya que el objeto devuelto siempre será del tipo "Object")
Lo opuesto es cierto para contravariantList
: puede acceder a todos los métodos con parámetros genéricos (usted sabe que debe ser una superclase de "Cadena", por lo que siempre puede pasar uno), pero no getters (El tipo devuelto puede ser de cualquier otro supertipo de Cadena)
Mire el Liskov substitution principle. En efecto, si la clase B extiende la clase A, entonces usted debería poder usar una B siempre que se requiera una A.
Este no responde la pregunta y es engañoso. Sería completamente posible diseñar un sistema variante que rompa la corrección semántica y, por lo tanto, viole el LSP. –
, este no es el caso para 'contra variant' decir. 'super.doSomething (" String ")' no se pudo reemplazar por 'sub.doSomething (Object)'. – zinking
Co-varianza: Iterable e Iterador. Casi siempre tiene sentido definir una covariante Iterable
o Iterator
. Iterator<? extends T>
se puede usar igual que Iterator<T>
- el único lugar donde aparece el parámetro de tipo es el tipo de devolución del método next
, por lo que se puede actualizar de manera segura a T
. Pero si tiene S
extiende T
, también puede asignar Iterator<S>
a una variable del tipo Iterator<? extends T>
. Por ejemplo, si se está definiendo un método de búsqueda:
boolean find(Iterable<Object> where, Object what)
usted no será capaz de llamar con List<Integer>
y 5
, así que es mejor definido como
boolean find(Iterable<?> where, Object what)
Contra-varianza: Comparador. Casi siempre tiene sentido usar Comparator<? super T>
, ya que se puede usar como Comparator<T>
. El parámetro tipo solo aparece como el tipo de parámetro del método compare
, por lo que T
se puede pasar con seguridad.Por ejemplo, si usted tiene un DateComparator implements Comparator<java.util.Date> { ... }
y desea ordenar un List<java.sql.Date>
con que comparador (java.sql.Date
es una subclase de java.util.Date
), se puede hacer con:
<T> void sort(List<T> what, Comparator<? super T> how)
pero no con
<T> void sort(List<T> what, Comparator<T> how)
- 1. .NET: Covarianza y contravarianza
- 2. Covarianza y contravarianza en lenguajes de programación
- 3. C# genéricos de lanzamiento (¿covarianza y contravarianza?)
- 4. Covarianza/Contravarianza con una expresión linq
- 5. interfaces de C# Covarianza y contravarianza al implementar
- 6. delegados de acción, los genéricos, covarianza y contravarianza
- 7. ¿Cuáles son los beneficios de la covarianza y la contravarianza?
- 8. C#: ¿Es la varianza (covarianza/contravarianza) otra palabra para polimorfismo?
- 9. covarianza/contravarianza: cómo hacer el siguiente código compilar
- 10. Diferencia entre covarianza y contra varianza
- 11. Diferencia entre covarianza y upcasting
- 12. ¿alguien podría explicar la conexión entre el tipo de covarianza/contravarianza y la teoría de categorías?
- 13. Java problema colecciones covarianza
- 14. genéricos de Java covarianza
- 15. Covarianza de Java
- 16. Covarianza frente a contravarianza con respecto a la herencia de clase
- 17. ¿Se aplica la covarianza/contravarianza a tipos implícitamente convertibles que no implementan una interfaz común?
- 18. Ejemplos de buenos casos de uso de la vida real para la covarianza y la contravarianza en C# 4.0?
- 19. contravarianza en expresiones
- 20. ¿Por qué la covarianza/contravarianza de C# 4.0 se limita a la interfaz parametrizada y tipos de delegados?
- 21. ¿Por qué el concepto de "Covarianza" y "Contravarianza" son aplicables al implementar los métodos de una interfaz?
- 22. covarianza en C#
- 23. .NET covarianza
- 24. límites Scala tipo inferior y la covarianza
- 25. Inferencia de covarianza y contradicción en C# 4.0
- 26. C++ covarianza en los parámetros
- 27. Coeficiente de Pearson y cálculo de covarianza en Matlab
- 28. Comprensión de la covarianza y la contradicción en C# 4.0
- 29. Covarianza e IList
- 30. Pregunta sobre C# covarianza
El primer ejemplo de contravariancia no funciona en Java. doSomething() en la Sub clase es una sobrecarga, no una anulación. –
De hecho. Java no admite argumentos contravariantes en la subtipificación. Solo covarianza para lo que concierne a los tipos de devolución de método (como en el primer ejemplo). –
Gran respuesta. La covarianza me parece lógica. ¿Pero podría indicarme un párrafo en JLS que describa la contradicción? ¿Por qué se invoca Sub.doSomething? – Mikhail