Genéricos sin colección

Tengo un método que generalmente toma un elemento de una lista y tiene una firma de:

myMethod(T item)

Quiero usar este método pero sé lo que estoy enviando.

SpecificItem myItem = new SpecificItem();

myMethod((T) myItem);

Esto no me sienta bien. ¿Es esto una señal de mal código?

Respuesta 1

Es mejor que codifique para la interfaz. Por ejemplo :

En myMethod:

<T extends <? super Item>> void (T item);

Esto le dice al compilador que solo acepte un tipo genérico de T que es una implementación / extensión de la interfaz / clase Item. Esto asegurará que la entrada dada sea del tipo correcto. El compilador lo garantiza.

En clase principal:

Item myItem = new SpecificItem();

El código dado anteriormente es la mejor práctica. Acostumbrarse a él. Pero (desaliento esto) también puedes codificar así:

SpecificItem myItem = new SpecificItem();

Puedes leer el código fuente de Java. Por ejemplo en la clase java.util.Collections. En el método de clasificación (Lista) , puede observar que Joshua Bloch se asegura de que la entrada dada siempre esté en el formato correcto. Para intentarlo, haz esto:

public class Class1 {
    public static void main(String[] args) {
        List<Class1> list = new ArrayList<Class1>();

        Collections.sort(list);
    }
}

El código anterior producirá un error de compilación. Para corregir este error de compilación, Class1 debe implementar la interfaz Comparable. Esto mantiene la precondición del método de clasificación (Lista) que supone que la entrada dada es una Lista de comparables.

Oh, casi me olvido de tu pregunta. En realidad no es un mal código ya que funciona. Solo quiero decirte que hay una mejor manera de hacerlo.

Respuesta: 2

Quizás estés buscando algo como esto:

class C<? extends T> {

   public void myMethod(T myItem) {
      ...
   }

}
Respuesta: 3

La forma en que llamas al método parece extraña. Si ha declarado su método genérico como

public <T> void myMethod(T item);

el compilador sabe que T es un tipo abstracto y que no debería necesitar convertirle un parámetro de entrada. Solo asegúrese de que T no se declare como algún tipo específico en su código.

upd: mira aquí para ver un ejemplo: http://www.java2s.com/Tutorial/Java/0200__Generics/Usinggenericmethodstoprintarrayofdifferenttypes.htm

Respuesta: 4

Quiero almacenar ciertos objetos en un HashMap. El problema es que, por lo general, solo usa un solo objeto como clave. (Puede, por ejemplo, usar una cadena.) Lo que quiero hacer para usar varios objetos. Por ...

Tengo que hacer una llamada SOAP desde mi programa java, para lo cual utilicé el eje apache. Mi programa es el siguiente: import org.apache.axis.client.Call; import org.apache.axis.client.Service; import javax.xml ....

Estoy tratando de crear un JASPI ServerAuthModule personalizado totalmente aislado de mi aplicación EAR. Depende de una versión heredada de Spring Framework 2.5.5. Estoy ejecutando WildFly 9.0.2.Final. Definí un ...

Tengo ese objeto oracle: CREATE O REPLACE tipo employee_obj AS object (id NUMBER (10), ...) función de procedimiento almacenado get_employee_obj () return employee_obj es ...