【问题标题】:How use generic T inside a method in java?如何在java中的方法中使用泛型T?
【发布时间】:2018-04-11 06:42:08
【问题描述】:

我们可以在 C# 中做到这一点:

private T getData<T>(Context context, String url, PostModel postModel) throws ApiException, IOException, ConnectionException {
    Response response = new CallApi<T>(Connection.getApiUrl(context))
            .Post(url, postModel);    
    if (response.code() != 200) throw new ApiException(context,response);

    Gson gson = new GsonBuilder()
            .setLenient()
            .create();
    T obj = gson.fromJson(response.body().charStream(),
            new TypeToken<T>() {
            }.getType());
    return obj;
}

调用:

EmployeeModel model =  getData<EmployeeModel>(context, url, null);

如您所见,我们在方法签名和方法内部声明了T,它在CallApi&lt;T&gt;new TypeToken&lt;T&gt; 中替换为EmployeeModel,它会返回EmployeeModel 对象作为结果。

在 Java(Android) 中,当我想使用这个泛型时,我有:

private <T> T getData(Context context, String url, PostModel postModel){...}

但它返回给我一个LinkedTreeMap 对象而不是EmployeeModel!当我将 从方法签名移动到类本身时,结果也是一样的。

我在网络和 StackOverflow 上搜索找到这种类型的使用,但文章只是关于如何将 T 转换为模型或如何将其作为参数传递。

请考虑我没有将T 作为参数传递给方法,我也没有 需要将T 转换为任何东西。 T 被用作 type 在 other 泛型方法类型!

那么如何在 Java 中实现这个方法呢?

【问题讨论】:

    标签: java android generics


    【解决方案1】:

    new TypeToken&lt;T&gt;() {} 不会像您希望的那样工作,因为类型擦除。

    您必须传入 TypeToken&lt;T&gt; 作为参数:

    EmployeeModel model = getData(
        context, url, null, new TypeToken<EmployeeModel>() {});
    

    更改方法签名以添加额外参数;那么:

    T obj = gson.fromJson(response.body().charStream(), typeToken);
    

    【讨论】:

    • 谢谢你,安迪。我认为这是完全正确的!我搜索了类型擦除,发现 T 将转换为 Object!编译时。所以它会失去它的类型!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2021-01-24
    • 2019-08-17
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    相关资源
    最近更新 更多