Токен универсального класса Java - PullRequest
0 голосов
/ 11 марта 2011

Я хочу инкапсулировать запросы в мой сервис Android, потому что у сервиса есть информация для генерации соответствующих команд.Однако я хотел бы ограничить токены класса, отправляемые в службу, расширенную из ICommand, чтобы я не разрешал отправку запросов с недействительными токенами.Это объяснит больше:

public class ServiceRequestArgs implements Serializable {

    private static final long serialVersionUID = -7484807396752170166L;

    private Class m_token; 
    //warning: references to generic type Class<T> should be parameterized
    private IFileUploadListener m_listener;

    public <T extends ICommand> ServiceRequestArgs(
        Class<T> cmdClass, IFileUploadListener listener)
    {
        m_token = cmdClass;
        m_listener = listener;
    }

    public Class getClassToken() //warning: references to generic...
    {
        return m_token;
    }

    public IFileUploadListener getListener()
    {
        return m_listener;
    }
}

//use ->
Intent intent = new Intent(this, MyService.class);
intent.putExtra("svc_command", 
    new ServiceRequestArgs(GetListCommand.class, m_listener);
bindService(intent, m_serviceConnection, 0);

Я понимаю общие ограничения C #, но я не уверен, как мне использовать это в Java.

Редактировать
Вот что я придумал:

public class ServiceRequestArgs<T extends ICommand> {

    private ServiceRequestArgs(Class<T> token, IFileUploadListener listener);

    public Class<T> getClassToken(); //...
    public IFileUploadListener getListener(); //...

    //to make it easier to call. sorry, cant remember where I found this.
    public <C extends ICommand> ServiceRequestArgs<C> create(
        Class<C> token, IFileUploadListener listener)
    {
        return new ServiceRequestArgs<C>(token, listener);
    }
}

Ответы [ 2 ]

3 голосов
/ 11 марта 2011

Я бы реализовал это как универсальный класс, а не пытался бы реализовать универсальный конструктор:

public class ServiceRequestArgs<T extends ICommand> {

    private Class<T> m_token;
    private ICommand m_listener;

    public ServiceRequestArgs(Class<T> cmdClass, ICommand listener)
    {
        m_token = cmdClass;
        m_listener = listener;
    }

    public Class<T> getClassToken()
    {
        return m_token;
    }

    public IFileUploadListener getListener()
    {
        return m_listener;
    }
}

Таким образом, универсальный тип T (ограничение и все) можно использовать во всем классе. В большинстве случаев универсальные конструкторы (для неуниверсального класса) не являются ответом .

1 голос
/ 11 марта 2011

Сначала вы хотите сделать класс родовым.Конструкторы не должны иметь своих собственных общих параметров.

Итак

public class ServiceRequestArgs<T extends ICommand> implements Serializable {

    private static final long serialVersionUID = -7484807396752170166L;

    private Class<T> m_token; 
    //warning: references to generic type Class<T> should be parameterized
    private IFileUploadListener m_listener;

    public ServiceRequestArgs(
        Class<T> cmdClass, IFileUploadListener listener)
    {
        m_token = cmdClass;
        m_listener = listener;
    }

    public Class<T> getClassToken() //warning: references to generic...
    {
        return m_token;
    }

    public IFileUploadListener getListener()
    {
        return m_listener;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...