Diferencia entre los parámetros genéricos de Java

¿Cuál es la diferencia entre pasar en parámetro genérico alguna clase genérica con y sin su parámetro genérico?

Ejemplo:

Clase genérica simple:

public class Foo<T> { /*...*/ }

Clase simple que extiende la clase genérica simple estableciendo el parámetro genérico en algún tipo irrelevante:

public class FooFoo extends Foo<Type1> { /*...*/ }

Otra clase genérica

public class Bar<T> extends FooFoo { /*...*/ }

Nuestra clase base que como parámetro genérico necesita algo que extienda la clase Foo

public class TestFooClass<T extends Foo<?>> { /*...*/ }

Y la pregunta ¿cuál es la deferencia entre estos dos parámetros?

public class BarTestOne extends TestFooClass<Bar> { /*...*/ }

public class BarTestTwo extends TestFooClass<Bar<?>> { /*...*/ }

Problema

Class<T> class = (Class<T>) ((Foo)getClass().getGenericSuperclass()).getActualTypeArguments()[0];

En el primer caso, el código funciona en el segundo no.

Respuesta 1

¿Parece que está tratando de determinar el tipo real con el que se parametriza TestFooClass?

En ese contexto, la diferencia entre usar una clase genérica con y sin su parámetro genérico es que getActualTypeArguments () [0]:

  1. En el primer caso, proporcione una instancia de Clase que represente el tipo sin formato
  2. En el segundo caso, proporcione una instancia de ParameterizedType (por lo tanto, uno puede obtener ClassCastException). Si llama a getRawType () en ese ParameterizedType, obtendrá Class que representa el tipo sin formato.

Esta:

BarTestOne one = new BarTestOne();
BarTestTwo two = new BarTestTwo();

Class<?> clazz1 = (Class<?>) ((ParameterizedType) one.getClass().getGenericSuperclass()).getActualTypeArguments()[0];       
Class<?> clazz2 = (Class<?>) ((ParameterizedType) ((ParameterizedType) two.getClass().getGenericSuperclass()).getActualTypeArguments()[0]).getRawType();

System.out.println(clazz1.equals(clazz2));

Esto volverá cierto .

Por desgracia, cualquier respuesta más profunda está más allá de mi conocimiento de los genéricos.

Respuesta: 2

Digamos que definí el siguiente servicio de servicio Thrift FileResource {binary get_file (1: string file_name)} Aquí está la implementación generada que no puedo entender pública ByteBuffer ...

Descubrí que la clase GeneralPath en Java solo proporciona métodos para verificar si un punto está dentro de una ruta general (para ser específico, un polígono con segmentos de línea recta). ¿Alguien sabe cómo ...

Estoy tratando de configurar un servidor de aplicaciones para ejecutar un sitio web simple y una aplicación cliente Java que necesita comunicarse de nuevo con un servidor Java. Lo que me gustaría hacer es lo siguiente: sitio web / web ...

He reunido un programa simple que usa reemplazo de fragmentos con una sola actividad y dos fragmentos. Un fragmento tiene un botón que, cuando se presiona, reemplaza el fragmento con un segundo fragmento ...