2013-04-25 174 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