Java泛型 - 推断嵌套类型

7
我已经定义了以下类:

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);

这就是为什么在C#中关键字“var”如此有用的原因。不幸的是,Java似乎缺少这个功能。 - Federico Berasategui
... 藏着什么?跟你的声明一样吗? - Jacob Raihle
1
@HighCore 这并不是很相关,所以...... - user1131435
1
没有办法让它更好看。 :( 这明显是类型系统的限制。 - yshavit
FYI C# 有相同的限制 - Paul Bellora
1个回答

3

Now I would like to have a class like this

OperationExecutor<T extends Operation<S>> extends AsyncTask<T,Void,S>{
    @Override
    protected S doInBackground(T... params) {
       return null;
    }
}
这段代码无法正常工作的原因是因为 S 并没有在任何地方被声明,只是在 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;
    }
}

没错,它需要是 OperationExecutor<Reservation>,你可以传递 GetReservationOperation 或任何其他的 Operation<Reservation> 到其中。 - Paul Bellora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接