在泛型方法java

时间:2016-02-24 12:22:17

标签: java android generics

具有TestJsonData定义的Interface类。

  public interface ICasAuthentication {
        <T> List<T> TestJsonData();
    }

接口类的实现方法

public class CasAuthentication implements ICasAuthentication {
    private IServiceHandler _iServiceHandler = null;
    public CasAuthentication(ServiceHandler ServiceHandler) {
        this._iServiceHandler = ServiceHandler;
    }

    public <T>List<T> TestJsonData() {
        List<T> response = null;
        return response = _iServiceHandler.<T>genericGetAll("https://api.github.com/users/hadley/orgs", MethodTypes.GET.toString(), null);
    }

}

同样是一个接口类,定义方法为genericGetAll

public interface IServiceHandler
{

    <T>List<T> genericGetAll(String destinationUrl, String method, HashMap<String, String> params);
}

接口类的实现方法

public class ServiceHandler implements IServiceHandler {
    public String response = null;
    private static Gson gson = new Gson();
    public ServiceHandler() {

    }

通用响应不是类 MyClass 类型。仍然不能参考班级类型。 T 类型仍未引用为Myclass类型

 public <T> List<T> genericGetAll(String destinationUrl, String method, HashMap<String, String> params) {
        List<T> genericResponse = null;
        String httpResponse = httpClient(destinationUrl, method, params);
        genericResponse = createListResponseHandler(httpResponse);
        return genericResponse;

    }
 private <T> List<T> createListResponseHandler(String string_response) {
        return gson.fromJson(string_response, new TypeToken<List<T>>() {
        }.getType());
    }
  }

如果我在gson.fromJson(string_response, new TypeToken<List<MyClass>>()中对MyClass进行硬编码。我能够获得没有硬编码的类类型,响应就像你在图像中看到的一样。

下面的代码调用方法TestJsonData()。我添加了隐式类型但仍无法找到解决方案

List<MyClass> res = _iCasAuthentication.<MyClass>TestJsonData();

下图显示了没有硬编码Myclass的响应值。

without hard code

下图显示了使用硬编码Myclass的响应值。

with hardcode value

1 个答案:

答案 0 :(得分:1)

如果省略显式设置type-parameter,如果编译器无法推断它,则默认为Object

为了明确设置它,你应该这样做:

List<MyClass> res = callingMethod.<MyClass>createListResponseHandler("");