3

我对为什么以下演员表不起作用感到非常困惑:

ScheduledThreadPoolExecutor timeoutControl = (ScheduledThreadPoolExecutor) Executors.newSingleThreadScheduledExecutor();

ScheduledThreadPoolExecutor 实现了 ScheduledExecutorService。如果我不能将它与实际类一起使用,那么这个 Executors 调用的意义何在。

我用错了吗(可能),有人可以提供一些指导吗?

4

3 回答 3

5

问题是它Executors.newSingleThreadScheduledExecutor();实际上不返回一个ScheduledThreadPoolExecutor.

类中的源代码Executors

public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
        return new DelegatedScheduledExecutorService
            (new ScheduledThreadPoolExecutor(1));
}

这些Delegated...类(也有一个DelegatedExecutorService)只是将所有调用传递给底层执行程序,ScheduledThreadPoolExecutor在这种情况下。代码中的注释表明这些类的全部意义在于隐藏底层执行程序可能具有的所有非接口方法。

无论如何,最好还是使用接口而不是您正在处理的对象的类版本(List而不是ArrayListScheduledExecutorService而不是ScheduledThreadPoolExecutor)。

如果您绝对需要在 中ScheduledThreadPoolExecutor而不是在 中可用的功能ScheduledExecutorService,您可以使用构造函数ScheduledThreadPoolExecutor来创建它的实例。

于 2012-04-17T22:47:18.023 回答
4

您应该只将返回的执行程序用作ScheduledExecutorService,而不是将其转换为ScheduledThreadPoolExecutor.

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
于 2012-04-17T22:44:23.490 回答
1

简化:

实现接口的类可以具有接口没有的其他方法和字段。在这种情况下,该方法返回接口,因此您不能将其向下转换为实现类。

于 2012-12-18T11:04:07.623 回答