Pregunta

Vi una función de Java que se parecía a esto:

public static<T> foo() {...}

Sé qué son los genéricos, pero ¿alguien puede explicarlos en este contexto?¿Quién decide a qué es igual T?¿Que está pasando aqui?

EDITAR:¿Alguien puede mostrarme un ejemplo de una función como esta?

¿Fue útil?

Solución

Te has perdido el retorno escribir a máquina, pero aparte de eso, es un método genérico. Al igual que con los tipos genéricos, T está en para cualquier tipo de referencia (dentro de los límites si se da).

Para los métodos, los parámetros genéricos son típicamente inferirse por el compilador. En determinadas situaciones, es posible que desee especificar los argumentos genéricos sí mismo, utilizando una sintaxis poco peculiar:

    List<String> strings = Collections.<String>emptyList();

En este caso, el compilador podría haber inferido el tipo, pero no siempre es obvio si el compilador puede o no puede. Nota, el <> es después del punto. Por razones sintácticas siempre se deben especificar el nombre del tipo o del objeto de destino.

Es posible tener constructores genéricos, pero nunca he visto uno en la naturaleza y la sintaxis empeora.

Creo en C ++ y C # sintaxis colocan los tipos genéricos después del nombre del método / función.

Otros consejos

El contexto es un método genérico en lugar de una clase. El <T> variables sólo se aplica a la llamada del método .. La clase Colecciones tiene un número de éstos; la clase en sí misma no es genérico, pero muchos de los métodos son.

El compilador decide lo que T es igual a - lo que equivale obtiene los tipos de trabajo. A veces esto es más fácil que otros.

Por ejemplo, el método static <T> Set<T> Collections.singleton(T o) el tipo se define en el parámetro:

Collections.singleton(String T)

devolverá un Set<String>.

A veces, el tipo es difícil de definir. Por ejemplo a veces no es fácil suficiente información para escribir Collection.emptyList(). En ese caso, se puede especificar el tipo directamente: Collection.<String>emptyList()

.

T es el parámetro de tipo formal, wich será reemplazado por el tipo real argumento utilizado en la instanciación del objeto.

Por ejemplo, aquí está la lista de definitios e Iterator en paquete java.util:

public interface List<E>{
  void add(E x);
  Iterator<E> iterator();
}

public interface Iterator<E>{
  E next();
  boolean hasNext();
}

A continuación, puede crear una instancia de una lista de esta manera:

List<String> ls = new ArrayList<String>()

¿Dónde se puede imaginar que la lista representa una versión de la lista, donde E tiene sido sustituido de manera uniforme por la secuencia:

public interface StringList{
  void add(String x)
  Iterator<String> iterator();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top