如何在Java中解释"public <T> T readObjectData(... Class <T> type)"?

pro*_*eek 34 java generics

我有这个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这是一种不好的做法.这是发明仿制药的一个原因.


raf*_*oro 9

您可能对类似和更常见的声明感到困惑:

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>给出了更长的答案