2013-04-21 158 views
0

我有下面的类在我的代码使用泛型类型参数类

public class GenericService<E> extends SpringAndroidSpiceRequest<E> { 
    public GenericService(Class<E> clazz) { 
     super(clazz); 

    } 
    @Override 
    public E loadDataFromNetwork() throws Exception { 
     return null; 
    } 
} 

现在这个类的构造函数采用类型类的参数。我想删除这个参数,并直接说超级(E.class)的东西?但这是我的错误。因此,如果我GenericService loginService = new GenericService 该构造函数应该与params Login.class调用超级。这是这样工作的,但不是通过说E.class的通用方式。我怎样才能做到这一点 ?

编辑

我想下面的类合并成一个单一CLAS

公共类login服务扩展SpringAndroidSpiceRequest {

private Login.Request loginRequest; 
private final String loginRequestURL = "/login"; 

public LoginService() { 
    super(Login.Response.class); 
} 

public final Login.Response loadDataFromNetwork() throws Exception { 

    Uri.Builder uriBuilder = Uri.parse(
      ProfileInfo.getActiveProfile().getbaseURL() + loginRequestURL) 
      .buildUpon(); 
    String url = uriBuilder.build().toString(); 

    return getRestTemplate().postForObject(url, loginRequest, 
      Login.Response.class); 
} 

@Override 
public final String createCacheKey() { 
    return loginRequest.getUsername() + "" + loginRequest.getPassword(); 
} 

}

public class ForgetPasswordService extends 
      SpringAndroidSpiceRequest<ForgetPassword.Response> { 

     private final String forgotPasswordURL = "/forgotpassword"; 

     public ForgetPasswordService() { 
      super(ForgetPassword.Response.class); 
     } 

     public final ForgetPassword.Response loadDataFromNetwork() throws Exception { 

      Uri.Builder uriBuilder = Uri 
        .parse(ProfileInfo.getActiveProfile().getbaseURL() 
          + forgotPasswordURL).buildUpon(); 
      String url = uriBuilder.build().toString(); 
      return getRestTemplate().postForObject(url, forgotPasswordRequest, 
        ForgetPassword.Response.class); 
     } 

     public final String createCacheKey() { 
      return forgotPasswordRequest.getPhoneOrEmailAddress(); 
     } 

    } 

两个类都是标识。两者之间唯一的区别就是他们给出的回应类型。现在我有大约23个这样的课程。如果不需要,真的很想加入所有这些类。

亲切的问候

+0

你似乎在试图做一些事情,可以更好地以不同的方式来完成:我有一个快速浏览一下SpringAndroidSpiceRequest的定义,以及loadDataFromNetwork似乎是唯一方法可以做任何事情。你试图通过重写返回null来实现什么? – fishinear 2013-04-21 12:20:31

+0

这只是一个测试。所有的请求都是不同的POJO类。我想要一个请求类而不是多个类。这就是为什么我想制作一个通用的请求类。这有意义吗? – user1730789 2013-04-21 13:40:49

回答

4

你不能因为类型擦除。您用作类型参数的哪个类的详细信息都不会使其成为运行时类。这是Java泛型

的限制,请参见http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

+0

那么,我怎么能让我的课没有参数构造函数? – user1730789 2013-04-21 11:37:39

+3

@ user1730789你不能建立一个无参数的构造函数*并且*保持你的类同时通用。 – dasblinkenlight 2013-04-21 11:39:24

+0

有依赖关系注入:( – user1730789 2013-04-21 11:40:47

0

有去依赖注入:(

要么找到一种方式来传递类对象,比如像

<constructor-arg type="java.lang.Class" value="com.mycompany.Foo"/> 

(我不确定春天这是否正确)

或创建一个子类:

public class FooService extends GenericService<Foo>{ 
    public FooService() { 
     super(Foo.class); 
    } 
}