2010-07-14 3 views
2

Как я могу реализовать интерфейс ContactService без получения предупреждения о непроверенных переходах от компилятора:избежать предупреждений компилятора при реализации интерфейса с ограниченным типом возвращаемого

interface ContactsService 
{ 
    <T extends Response> T execute(Action<T> action); 
} 

interface Action<T extends Response> { } 

interface Response{ } 

class GetDetailsResponse implements Response {} 

Если я вернуть экземпляр GetDetailsResponse я получаю предупреждение: Неконтролируемый наиважнейшая: возвращаемый тип требует непроверенных Конверсиям

Это пример из GWT наилучшей практики представления на Google IO.

+0

Отсутствует '' после названия интерфейса опечатка? –

+0

fixed missing T – Shanta

+1

Что такое подпись 'Action ' class/interface? Покажите нам пример с предупреждением компилятора. –

ответ

2

Я предполагаю, что вы пытались что-то вроде:

class MyService implements ContactsService { 
    @Override 
    public <T extends Response> T execute(Action<T> action) { 
     return (T)new GetDetailsResponse(); 
    } 
} 

Проблема в том, что я, возможно, еще один класс, который реализует MyResponse ответ. Тогда я могу назвать:

Action<MyResponse> action = new Action<MyResponse>(); 
// you can't actually instantiate an interface, just an example 
// the action should be some instance of a class implementing Action<MyResponse> 
MyReponse r = myService.execute(action); 

Но выполнить метод возвращает экземпляр GetDetailsResponse, который несовместим с MyReponse. Вам нужно вернуть тип T, который задается действием, которое вы передаете для выполнения.

Насколько я могу судить, вы не можете создать новую переменную типа T внутри выполнения (не без каких-либо непроверенных бросков). Вероятно, вам нужен класс action, чтобы предоставить вам экземпляр Response, который вы можете вернуть из execute. Что-то вроде этого:

interface Response { 
    void setWhatever(String value); 
} 

interface Action<T extends Response> { 
    T getResponse(); 
} 

class MyAction implements Action<GetDetailsResponse> { 
    @Override 
    public GetDetailsResponse getResponse() { 
     return new GetDetailsResponse(); 
    } 
} 

class MyService implements ContactsService { 
    @Override 
    public <T extends Response> T execute(Action<T> action) { 
     T response = action.getResponse(); 
     // do something to Response here like 
     response.setWhatever("some value"); 
     return response; 
    } 
} 
+0

В отсутствие искателя, я должен был бы поддержать это и предположить, что это то, что происходит. Короче говоря, вы не можете иметь общий тип возврата и возвращать что-то не в общем! –

1

Для реализации ContactsService, вы должны быть способны обрабатывать любой вид Response. Пользователь может передать вам Action<FooResponse> и ожидать FooResponse или может дать Action<BarResponse> и вы хотите BarResponse. Если вы не в состоянии это сделать, то вы не удовлетворяете требованиям интерфейса.

Если интерфейс хочет признать реализации, которые поддерживают только один вид Response, то он сам будет генерироваться на <T extends Response>, а не только на его метод.

Смежные вопросы