Pergunta

Eu vi uma função java que parecia algo como isto -

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

Eu sei o que os genéricos são, mas alguém pode explicar o neste contexto? Quem decide o que T é igual a? O que está acontecendo aqui?

EDIT:. Alguém por favor pode me mostrar um exemplo de uma função como esta

Foi útil?

Solução

Você perdeu o tipo de fora de retorno, mas para além de que é um método genérico. Tal como acontece com tipos genéricos, T está em para qualquer tipo de referência (dentro de limites se for dada).

Para os métodos, parâmetros genéricos são tipicamente inferido pelo compilador. Em certas situações, você pode querer especificar os argumentos genéricos mesmo, usando uma sintaxe um pouco peculiar:

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

Neste caso, o compilador poderia ter inferido do tipo, mas nem sempre é óbvio se o compilador pode ou não pode. Note, o <> é após o ponto. Por razões sintáticas o nome do tipo ou objeto de destino deve ser sempre especificado.

É possível ter construtores genéricos, mas eu nunca vi um em estado selvagem e a sintaxe fica pior.

Acredito C ++ e C # sintaxes colocar os tipos genéricos após o método nome / função.

Outras dicas

O contexto é um método genérico em oposição a uma classe. O <T> variável aplica-se apenas para a chamada do método .. A classe Colecções tem um número destes; a própria classe não é genérico, mas muitos dos métodos são.

O compilador decide o T é igual a - é igual a tudo o que recebe os tipos de trabalho. Às vezes, isso é mais fácil do que outros.

Por exemplo, o static <T> Set<T> Collections.singleton(T o) método do tipo definido no parâmetro:

Collections.singleton(String T)

retornará a Set<String>.

Às vezes, o tipo é difícil de definir. Por exemplo, às vezes não é facilmente informações suficientes para tipo Collection.emptyList(). Nesse caso, você pode especificar o tipo diretamente: Collection.<String>emptyList()

.

T é o parâmetro de tipo formal, wich será substituído pelo tipo real argumento usado na instanciação do objeto.

Por exemplo, aqui é o definitios Lista e Iterator em java.util pacote:

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

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

Em seguida, você pode instanciar uma lista desta maneira:

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

Onde você pode imaginar que lista significa uma versão de lista onde E tem sido uniformemente substituídas por cordas:

public interface StringList{
  void add(String x)
  Iterator<String> iterator();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top