2013-04-21 156 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); 
    } 
}