2013-04-25 173 views
7

我已經定義了以下類:Java泛型 - 推斷嵌套類型

class Operation<S> 
class GetReservationOperation extends Operation<Reservation> 

現在,我想有這樣一個類:

OperationExecutor<T extends Operation<S>> extends AsyncTask<T,Void,S>{ 
    @Override 
    protected S doInBackground(T... params) { 
     return null; 
    } 
} 

但這不會編譯:

OperationExecutor<GetReservationOperation> executor = new .... 

爲什麼不是Java允許這樣做?

一段時間後,我想出了以下解決方案:

OperationExecutor<T extends Operation<S>,S> extends AsyncTask<T,Void,S>{ 
    @Override 
    protected S doInBackground(T... params) { 
     return null; 
    } 
} 

但是,這迫使我寫:

OperationExecutor<GetReservationOperation,Reservation> executor = new .... 

這看起來很奇怪。有什麼辦法讓它看起來更好嗎?

編輯 這個工作

OperationExecutor<S> extends AsyncTask<Operation<S>,Void,S>{ 
    @Override 
    protected S doInBackground(Operation<S>... params) { 
     return null; 
    } 
} 

OperationExecutor<Reservation> executor = new .... 
executor.execute(getReservationOperation); 
+0

這就是爲什麼關鍵字'var'在C#中非常有用的原因。不幸的是,java似乎缺乏這一點。 – 2013-04-25 20:52:46

+0

那麼隱藏在'...'背後的是什麼?和你的聲明一樣嗎? – 2013-04-25 20:54:03

+1

@HighCore這不是真的有意義,所以...... – Zyerah 2013-04-25 21:05:55

回答

3

現在我想有一類這樣的

OperationExecutor<T extends Operation<S>> extends AsyncTask<T,Void,S>{ 
    @Override 
    protected S doInBackground(T... params) { 
     return null; 
    } 
} 

這之所以不起作用是因爲S不是招」 t已被任何地方宣稱爲,僅引用爲ty pe論據在T的束縛。 Java需要S以聲明其他引用纔有意義,例如protected S doInBackgroundAsyncTask<T,Void,S>

您可能會考慮的一件事是OperationExecutor是否需要通用於特定類型的Operation<S>。你可以這樣做,例如:

OperationExecutor<S> extends AsyncTask<Operation<S>, Void, S> { 
    @Override 
    protected S doInBackground(Operation<S>... params) { 
     return null; 
    } 
} 
+0

@ user1778240正確的,這將需要'OperationExecutor ' ,在其中你可以通過'GetReservationOperation's或任何其他操作''。 – 2013-04-26 04:26:14

+1

能否downvoter請解釋一下? – 2013-04-26 04:26:34