如何实例化 Class来自T?

发布于 2024-12-13 12:13:52 字数 432 浏览 0 评论 0原文

我有以下方法:

public <T> execute(HttpRequest request) {
   ...
   // in parseAs i have to pass Class<T> how can I instantiate it from T?
   request.execute().parseAs(classT);
}

PS: parseAs 是来自 Google http 客户端库

I've got following method:

public <T> execute(HttpRequest request) {
   ...
   // in parseAs i have to pass Class<T> how can I instantiate it from T?
   request.execute().parseAs(classT);
}

PS: parseAs is method from google http client library.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

郁金香雨 2024-12-20 12:13:52

您不能使用这些参数。

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

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

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

public <T> execute(Class<T> klass, HttpRequest request) {
   ...
   request.execute().parseAs(klass);
}

You cannot with those parameters.

Java's generics use something called type erasure - basically all those Ts become Object at runtime. So if you actually need to know what class this T is, you'll need a Class object to be passed in. This is exactly what parseAs is doing - to invoke parseAs<String>, you'd call parseAs(String.class).

However, your execute has no Class parameter. As such, it has no idea what specialization it was invoked with, and cannot therefore pass that data on to parseAs.

The solution is to add a Class<T> parameter and punt to the next level up in the call chain, where the concrete type is (hopefully) known:

public <T> execute(Class<T> klass, HttpRequest request) {
   ...
   request.execute().parseAs(klass);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文