Java 泛型——推断嵌套类型

标签 java generics language-design

我定义了以下类:

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

最佳答案

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

关于Java 泛型——推断嵌套类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16224457/

相关文章:

c++ - 如何在 C++ 中为 Node.JS 实现动态变量

java - JUnit java.net.ConnectException

java - 集合的 "max"函数的这两个通用签名之间是否有区别

c - 泛型与类型安全?在 C 中使用 void*

cuda - 如何实现CUDA <<<…>>>()内核启动语法

java - 为什么有 JVM 指令 `monitorenter/monitorexit` 而没有 `wait/notifyAll`(它们是 native 调用)?

java - 从canvas java创建位图

java - 我怎样才能使用util :list in spring configuration file

javascript - 使用已有的链接向 ahref 按钮添加属性

generics - 实现 "generic"节点列表