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中实现这个方法呢?
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)
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |