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

Sia*_*dos 5 java generics android

我们可以在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;
}
Run Code Online (Sandbox Code Playgroud)

致电:

EmployeeModel model =  getData<EmployeeModel>(context, url, null);
Run Code Online (Sandbox Code Playgroud)

正如您所看到的T那样,我们在方法签名中声明并在方法内部,将其替换为EmployeeModelin CallApi<T>new TypeToken<T>,它将返回EmployeeModel对象作为结果.

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

private <T> T getData(Context context, String url, PostModel postModel){...}
Run Code Online (Sandbox Code Playgroud)

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

我搜索Web和StackOverflow以查找此类型的使用,但文章只是关于如何转换T为模型或如何将其作为参数传递.

请考虑我没有将T方法作为参数传递给我,我不需要转换T为任何东西.T被用作类型的其他泛型方法的类型!

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

And*_*ner 5

new TypeToken<T>() {}由于类型擦除,它不会像你想要的那样工作。

您必须传入 aTypeToken<T>作为参数:

EmployeeModel model = getData(
    context, url, null, new TypeToken<EmployeeModel>() {});
Run Code Online (Sandbox Code Playgroud)

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

T obj = gson.fromJson(response.body().charStream(), typeToken);
Run Code Online (Sandbox Code Playgroud)