Java 如何实例化类<;T>;从T?

Java 如何实例化类<;T>;从T?,java,google-api-java-client,Java,Google Api Java Client,我有以下方法: public <T> execute(HttpRequest request) { ... // in parseAs i have to pass Class<T> how can I instantiate it from T? request.execute().parseAs(classT); } public执行(HttpRequest请求){ ... //在parseAs中,我必须传递类,如何从T实例化它? request.

我有以下方法:

public <T> execute(HttpRequest request) {
   ...
   // in parseAs i have to pass Class<T> how can I instantiate it from T?
   request.execute().parseAs(classT);
}
public执行(HttpRequest请求){
...
//在parseAs中,我必须传递类,如何从T实例化它?
request.execute().parseAs(classT);
}

PS:parseAs是来自的方法。

您不能使用这些参数

Java的泛型使用了一种叫做类型擦除的东西——基本上所有的
T
s在运行时都变成
Object
。因此,如果您确实需要知道这个
T
是什么类,则需要传入一个
class
对象。这正是
parseAs
正在做的事情——要调用
parseAs
,您需要调用
parseAs(String.class)

但是,您的
execute
没有
Class
参数。因此,它不知道调用它时使用了什么专门化,因此无法将数据传递给
parseAs

解决方案是添加一个
Class
参数,并将其推到调用链中的下一个级别,具体类型(希望)已知:

public执行(类klass,HttpRequest请求){
...
request.execute().parseAs(klass);
}

但请注意,这仅在T本身不是参数化类型时才有效。例如,它可以是整数,但不能是列表。(代码可以很好地编译,但是没有办法获得Class类型的值,因此它不会有用。)如果没有额外的类变量,这个公共void执行(HttpRequest请求,AjaxListener回调)仍然不可能吗?@skayred,不!<代码> <代码>在运行时消失,它变成<代码>执行(HypReQuestRead,Ajax侦听器回调) @ SkayReD,还应该注意到,其他一些语言避免了这个问题,特别是.NET(C++等)和C++不执行类型擦除。Java这样做是因为它需要与引入泛型之前构建的库保持兼容。@skayred,
execute(HttpRequest请求、AjaxListener回调、类klass)
将使之成为可能。
public <T> execute(Class<T> klass, HttpRequest request) {
   ...
   request.execute().parseAs(klass);
}