我有这个Java代码.
public <T> T readObjectData(ByteBuffer buffer, Class<T> type) {
...
T retVal = (T) summaries;
return retVal;
Run Code Online (Sandbox Code Playgroud)
如何解释这段代码?为什么我们需要public <T> T而不是public T?
如何将参数赋给第二个参数(Class<T> type)?
rge*_*man 47
这声明了readObjectData方法通用,带有一个类型参数T.
public <T> ...
Run Code Online (Sandbox Code Playgroud)
然后返回类型是T.
... T readObjectData(...
Run Code Online (Sandbox Code Playgroud)
如果没有初始化<T>,即泛型类型声明,则符号T将是未定义的.
在参数列表中,Class<T> type是参数之一.因为返回类型和这个参数都引用T,这确保了如果你传入一个Class<String>,那么它将返回一个String.如果你传入一个Class<Double>,那么它将返回一个Double.
要传入参数,请传入任何Class对象,例如String.class.
cdh*_*wie 27
该<T>部分声明了泛型类型参数 T.如果您要省略此部分,编译器可能会抱怨该类型T不存在.
在这种情况下,T作为实际类型的占位符,仅在使用非泛型类型参数实际调用方法时确定.
public <T> T readObjectData(...
^ ^
| + Return type
+ Generic type argument
Run Code Online (Sandbox Code Playgroud)
Ale*_*exR 18
<T>是一个参数类.没有命名的类T.您可以将此方法用于通过名为的第二个方法参数指定的任何类type.
因为方法定义如下:
public <T> T readObjectData(ByteBuffer buffer, Class<T> type)
你可以按下面的说法调用它:
MyClass obj = o.readObjectData(buffer, MyClass.class);
请注意您不必将返回值转换readOjectData()为MyClass.曾几何时,在java 5之前,这个方法将被定义为:
public Object readObjectData(ByteBuffer)
它的用法如下:
MyClass obj = (MyClass)o.readObjectData(buffer);
由于铸造可能会导致ClassCastException这是一种不好的做法.这是发明仿制药的一个原因.
您可能对类似和更常见的声明感到困惑:
class MyClass<T> {
private T myMethod(T a){
return a;
}
}
Run Code Online (Sandbox Code Playgroud)
在上述情况下,不需要"<T>"后置private(private <T> T myMethod(T a))
因为T它使用的与该类中定义的相同MyClass<T>
如果您写得更多
class MyClass<T> {
private <T> T myMethod(T a){
return a;
}
}
Run Code Online (Sandbox Code Playgroud)
那么含义是myMethod返回类型(可能)与MyClass类型不同。好像您是这样写的:
class MyClass<T1> {
private <T2> T2 myMethod(T2 a){
return a;
}
}
Run Code Online (Sandbox Code Playgroud)
鸣谢:取自“ Kanagavelu Sugumar”的示例,该示例对如何在Java中使用Class <T>给出了更长的答案。