Como interpretar " public t readObjectData (...Class type)" em 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
)?
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
.
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
<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);
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