如何在java中的方法中使用泛型T?

时间:2018-04-11 06:42:09

标签: java android generics

我们可以在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并在方法内部,将其替换为EmployeeModelCallApi<T>中的new TypeToken<T>,它将返回{{1}作为结果的对象。

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

EmployeeModel

但是它返回一个private <T> T getData(Context context, String url, PostModel postModel){...} 对象,而不是LinkedTreeMap!当我移动&lt; T>从方法签名到类本身的结果也一样。

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

  

请注意我没有将T作为参数传递给方法而我不会   需要将T投射到任何东西上。 T在其他地方用作类型   通用方法类型!

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

1 个答案:

答案 0 :(得分:4)

由于类型擦除,

new TypeToken<T>() {}不会像你想要的那样工作。

您必须传递TypeToken<T>作为参数:

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

更改方法签名以添加额外参数;然后:

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