Wildcard Lower Bound
📘 Java Generics Avanzado: <? super Y> explicado
🧠 Contexto
Firma original:
<Y extends Comparable<? super Y>> Predicate greaterThan(Expression<? extends Y> var1, Y var2);
🔍 Parte clave
Comparable<? super Y>
👉 Esto significa:
“Y debe poder compararse con Y o con cualquiera de sus supertipos”
🧱 ¿Qué significa ? super Y?
Es un wildcard con límite inferior (lower bound).
? super Y
👉 Se traduce como:
“algún tipo que es Y o un supertipo de Y”
📊 Ejemplo simple
class Animal {}
class Perro extends Animal {}
Entonces:
Comparable<? super Perro>
👉 puede ser:
- Comparable
✅ - Comparable
✅ - Comparable
🚫 Pero NO sería válido
- Comparable
❌ (no es supertipo) - Comparable
❌
🧠 ¿Por qué existe esto?
Para permitir flexibilidad en comparaciones
Ejemplo real:
class Animal implements Comparable<Animal> {
public int compareTo(Animal o) {
return 0;
}
}
class Perro extends Animal {}
👉 Perro NO implementa Comparable
✔️ Sí es Comparable
Gracias a <? super Y> esto sigue siendo válido.
🔥 Caso práctico sin super
Si fuera:
<Y extends Comparable<Y>>
👉 Entonces:
- Perro ❌ (porque no implementa Comparable
) - Animal ✅
👉 Sería mucho más restrictivo.
🧠 Regla mental clave
? extends T → leer
? super T → escribir / consumir
🧪 Ejemplo con listas
List<? super Perro> lista;
Puedes hacer:
lista.add(new Perro()); // ✅
lista.add(new Bulldog()); // ✅ si extiende Perro
Pero al leer:
Object obj = lista.get(0); // ⚠️ solo Object
🎯 Aplicado a Criteria API
<Y extends Comparable<? super Y>>
👉 Garantiza que:
- Y puede compararse consigo mismo
- O con un tipo más general
- Y el código sigue siendo seguro
🚀 Resumen final
? super Y→ acepta supertipos- Aporta flexibilidad
- Evita restricciones innecesarias
- Es clave en APIs genéricas avanzadas
🧠 Frase para recordar
“
superabre hacia arriba en la jerarquía de tipos”