【问题标题】:How can instantiate Class<T> from T?如何从 T 实例化 Class<T>?
【发布时间】:2011-11-04 04:52:53
【问题描述】:

我有以下方法:

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 client library 的方法。

【问题讨论】:

    标签: java google-api-java-client


    【解决方案1】:

    你不能使用这些参数。

    Java 的泛型使用称为类型擦除的东西——基本上所有Ts 在运行时都变成Object。因此,如果您确实需要知道这个T 是什么类,则需要传入一个Class 对象。这正是parseAs 正在做的事情——调用parseAs&lt;String&gt;,你可以调用@ 987654327@.

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

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

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

    【讨论】:

    • 虽然请注意,这仅在 T 本身不是参数化类型时才有效。例如,它可以是 Integer,但不能是 List。 (代码编译得很好,但是没有办法获得 Class> 类型的值,所以它没有用处。)
    • 如果没有额外的类变量,这个 public void execute(HttpRequest request, AjaxListener callback) 怎么办?
    • @skayred,不! &lt;T&gt; 在运行时消失,变成execute(HttpRequest request, AjaxListener callback)
    • @skayred,还应该注意,其他一些语言避免了这个问题——特别是,.NET(C# 等)和 C++not 执行类型擦除。 Java 这样做是因为它需要与在引入泛型之前构建的库保持兼容。
    • @skayred,也,execute(HttpRequest request, AjaxListener&lt;T&gt; callback, Class&lt;T&gt; klass) 将使它成为可能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    相关资源
    最近更新 更多