2013-04-21 4 views
0

У меня есть следующий класс в своем кодеИспользование Generic Тип параметра Классы

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

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

Теперь конструктор этого класса принимает аргумент класса типа. Я хочу удалить этот параметр и прямо сказать что-то вроде super (E.class)? Но это дало мне ошибку. Поэтому, если i GenericService loginService = new GenericService , конструктор должен вызвать супер с параметрами Login.class. Это работает так, но не общий способ, говоря E.class. Как я могу это сделать ?

EDIT

Я хочу, чтобы объединить следующие классы в единую CLAS

общественного класса LoginService распространяется 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 из этих классов. На самом деле идея abad добавляет все эти классы, если они не нужны.

С наилучшими пожеланиями

+0

Вы, кажется, пытается сделать что-то, что может быть лучше сделать по-другому: у меня был быстрый взгляд на определение SpringAndroidSpiceRequest и loadDataFromNetwork, кажется, только метод, который делает что угодно. Что вы пытаетесь достичь, переопределив это, чтобы вернуть null? – fishinear

+0

Это всего лишь тест. Все запросы отличаются от классов POJO. Я хочу иметь один класс запроса, а не несколько классов. Вот почему я хочу создать общий класс запросов. Имеет ли это смысл ? – user1730789

ответ

4

Вы не можете из-за типа Erasure. Ни одна из деталей того класса, который вы использовали в качестве параметра типа, не попадает в класс выполнения. Это ограничение Java дженериков

См http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

+0

Итак, как я могу создать конструктор аргументов для моего класса? – user1730789

+3

@ user1730789 Вы не можете создать конструктор без аргументов * и * сохранить свой класс в одно и то же время. – dasblinkenlight

+0

Входит в зависимость Инъекция :( – user1730789

0

Там идет зависимость Инъекции :(

Либо найти способ передать объект класса, например, что-то вроде

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

(я не уверен, что это верно весной)

или создать подкласс:

public class FooService extends GenericService<Foo>{ 
    public FooService() { 
     super(Foo.class); 
    } 
} 
Смежные вопросы