2009-11-03 14 views
10

que se confunden cuando me encuentro con un método genérico de este tipo.¿Cuál es el uso de <T> en <T> T addAndReturn pública estática (elemento T, colección Colección <T>) {

public static <T> T addAndReturn(T element, Collection<T> collection){ 
    collection.add(element); 
    return element; 
} 

no puedo entender por qué se requiere <T> en este método.

Además, ¿cuál es la diferencia entre los métodos genéricos y los métodos que usan la sintaxis de los genéricos?

+0

Lea las pautas de formato antes de enviar su pregunta. Son bastante difíciles de perder – Joe

+1

intente formatear los ejemplos de código como código – NDM

+0

@Joe, @Nicky De Maeyer: Solucioné los problemas de formato y eliminé el PS. – Asaph

Respuesta

4

La alternativa, usar el objeto en lugar de T, haría que la función devuelva el objeto.

Cuando vuelve T, se puede hacer algo como:

addAndReturn(myElement, col).SomeMethodOfMyElement(); 

Si addAndReturn volvió objeto en lugar, usted tendría que usar ya sea

((MyElementType)addAndReturn(myElement, col)).SomeMethodOfMyElement(); 

que necesita una conversión explícita, o

addAndReturn(myElement, col); 
myElement.SomeMethodOfMyElement; 

que necesita dos instrucciones en lugar de una.


EDIT: Ahora que su pregunta ha sido formateado, veo que uno de los parámetros es Collection<T>. En ese caso, la sintaxis genérica asegura que

addAndReturn(mySquare, collectionOfCircles); 

devuelve un error en tiempo de compilación en lugar de un error de tiempo de ejecución.


EDIT: Y en caso de que su pregunta era acerca de la sintaxis <T> en lugar de sobre el uso de los genéricos en general: El <T> le dice al compilador que el T utilizado en la definición del método es no alguna clase T sino más bien un marcador de posición para cualquier clase "adecuada" para una llamada específica del método.

+1

Gracias por el último comentario EDIT. De eso se trata mi pregunta. Todo lo que necesito saber es esto. ¿Los siguientes fragmentos de código hacen alguna diferencia en el compilador? ¿Si es así, cómo? 1. public static T addAndReturn (colección Colección ) {} 2. pública T addAndReturn (colección Colección ) estática {} –

+0

Lo sentimos. Me perdí mi formateo esta vez también. ¿Puede decirme cómo formateo mi código en esto? –

+0

En la segunda variante, el compilador cree que está creando una función que devuelve la clase T. Literal "T", como en "clase T {...}". En la primera variante, está creando una función que funciona para las clases * all *: si pasa un Entero y una Colección , devolverá un Entero. – Heinzi

-1

Que es un T genérico es simplemente un marcador de posición para el tipo más concreto que se devuelve. En el caso que proporcionó T, es el tipo de elemento que está agregando a la colección.

Collection<int> intCollection = new Collection(); 
int addedInt = addAndReturn(5, intCollection); 
addedInt == 5; 

Puesto que son todos T en lugar de T1 o T2 deben ser del mismo tipo de objeto como se requiere un único tipo, obviamente, ya que la función añade un tipo a una colección genérica

+2

Como esto es java, esperaba que quisieras decir Collection :) – penpen

-1

T se utiliza para razones polimórficas, si podemos decirlo. T es cualquier tipo de clase Tipo.

Dicho esto, si viene a tener una clase de Cliente, por ejemplo, puede utilizar este método mencionado anteriormente para procesar su tipo de usuario Clase de cliente. T le permite colocar en cualquier tipo que desee.

T le permitirá utilizar este método genérico para sus propios tipos definidos por el usuario, al igual que lo hará para los tipos de valor o de cualquier otro tipo. T se convierte en el tipo especificado en el parámetro del elemento.

0

Este método devuelve la misma entrada element probablemente porque los ejecutores la intención de utilizar un Fluent Interface como forma de proporcionar una API más legible:

addAndReturn(myElement, col).doElementStuff().doOtherElementStuff(); 

Here que tienen un buen tutorial sobre genéricos de Java que encuentro completo y esclarecedor .

8
> public static <T> T addAndReturn(T 
> element, Collection<T> collection){ 
>  collection.add(element); 
>  return element; } 

El <T> (en paréntesis) que se conoce como el parámetro de tipo genérico, mientras que el T que precede directamente el nombre del método es el tipo de retorno. Es posible que tenga un método genérico que arroje algún otro tipo que no sea genérico. Tal vez desee un método que agregue un elemento a una colección (por lo que un objeto de tipo T), y en lugar de devolver el objeto agregado (que también sería del tipo T), desea que devuelva el índice de ese elemento en el colección, que siempre sería un int.

Ejemplo método de firma en el que el tipo de retorno no es el tipo genérico: métodos

public static <T> Integer addAndReturn(T element, Collection<T> collection) 

genéricos, como cualquier otro método, puede tener cualquier tipo de retorno, incluyendo el tipo genérico sí mismo, cualquier otro tipo de clase, cualquier tipo de datos básico o inherente, o nulo. Puede confundir 2 partes no relacionadas de la firma del método, pensando que son dependientes, cuando no lo son. Solo son "dependientes" en el sentido de que si usa use T como el tipo de devolución, el tipo del valor devuelto es del tipo genérico que proporciona en el sitio de la llamada.

Cuestiones relacionadas