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<Perro>
  • Comparable<Animal>
  • Comparable<Object>

🚫 Pero NO sería válido

  • Comparable<Gato> ❌ (no es supertipo)
  • Comparable<String>

🧠 ¿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<Perro>, pero:

✔️ Sí es Comparable<Animal>

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<Perro>)
  • 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

super abre hacia arriba en la jerarquía de tipos”