Como interpretar " public t readObjectData (...Class type)" em Java?

Tenho este código Java.

public <T> T readObjectData(ByteBuffer buffer, Class<T> type) {
...
T retVal = (T) summaries;
return retVal;
Como interpretar este código? Por que precisamos de public <T> T em vez de public T?

Como dar o parâmetro ao segundo argumento (Class<T> type)?

Author: Paul Bellora, 2013-04-09

4 answers

Isto declara o método readObjectData genérico, com um parâmetro de tipo, T.

public <T> ...

Então o tipo de retorno é T.

... T readObjectData(...

Sem o <T> inicial, que é a declaração de tipo genérico, o símbolo T será indefinido.

Na lista de parâmetros, Class<T> type é um dos parâmetros. Porque o tipo de retorno e este parâmetro de referência T, isto garante que se você passar em um Class<String>, então ele retornará a String. Se você passar em um Class<Double>, Então ele vai voltar a Double

Para passar no parâmetro, passe em qualquer objeto Class, por exemplo String.class.

 33
Author: rgettman, 2013-04-08 20:42:19

A parte <T> está a declarar um argumento de tipo genérico T. Se você omitisse esta parte, o compilador provavelmente reclamaria que o tipo T não existe.

Neste caso, T serve de substituição para um tipo real, que só será determinado quando o método for realmente chamado com argumentos de tipo não-Genérico.

public <T> T readObjectData(...
        ^  ^
        |  + Return type
        + Generic type argument
 22
Author: cdhowie, 2013-04-08 20:42:21

<T> é uma classe de parâmetros. Não há nenhuma classe chamada T. Você pode usar este método com qualquer classe especificada através do argumento do segundo método chamado type.

Uma vez que o método é definido como:

public <T> T readObjectData(ByteBuffer buffer, Class<T> type)

Podes chamar - lhe como está escrito abaixo:

MyClass obj = o.readObjectData(buffer, MyClass.class);

Por favor, preste atenção que você não tem que lançar valor de retorno de readOjectData() a MyClass. Once upon a time, before java 5 this method would be defined as:

public Object readObjectData(ByteBuffer)

E a sua a utilização parecia-se com:

MyClass obj = (MyClass)o.readObjectData(buffer);

Uma vez que o casting pode causar isto é uma má prática. Esta foi uma razão para a invenção dos genéricos.
 13
Author: AlexR, 2013-04-08 20:47:10

Provavelmente está confuso com uma declaração semelhante e mais comum:

class MyClass<T> {
   private  T myMethod(T a){
       return  a;
   }
}

No caso acima, não há necessidade de "<T>" Depois de privado ( private <T> T myMethod(T a) )

Porque o {[5] }que está a usar é o mesmo que o definido na classe MyClass<T>

Ainda mais, se escreveres

class MyClass<T> {
   private <T> T myMethod(T a){
       return  a;
   }
}

Então o significado é que o tipo de retorno mymetod é (potencialmente) diferente do tipo MyClass. Como se tivesses escrito isto em vez disso:

class MyClass<T1> {
   private <T2> T2 myMethod(T2 a){
       return  a;
   }
}

Créditos: tomou o exemplo de "Kanagavelu Sugumar "' s longer answer to How to use Class in Java?

 2
Author: rafahoro, 2017-05-23 11:54:34