gpt4 book ai didi

Java BlockingQueue 不可转换类型

转载 作者:行者123 更新时间:2023-12-01 12:31:51 26 4
gpt4 key购买 nike

我正在使用 ThreadPoolExecutor在某些代码中,我为其提供 BlockingQueue<Runnable> 。我收到编译器错误:can't resolve constructor 。所以我尝试类型转换 queue明确地 BlockingQueue<Runnable> 。但是,我收到 ThreadPoolExecutor 的编译器错误的构造函数:

Inconvertible types, cannot cast PriorityBlockingQueue<MyRunnable> to BlockingQueue<Runnable>

即使 PriorityBlockingQueue 也会发生这种情况实现BlockingQueueMyRunnable实现Runnable 。我在 Android 上使用 Java 7。

代码:

public class Test {
PriorityBlockingQueue<MyRunnable> queue = new PriorityBlockingQueue<>(...);

//compiler error without cast
ThreadPoolExecutor executor = new ThreadPoolExecutor(..., queue, ...);
//compiler error with cast
ThreadPoolExecutor executor = new ThreadPoolExecutor(..., (BlockingQueue<Runnable> queue, ...);

public static class MyRunnable implements Runnable {...}

临时解决方案:

为了让它编译,我已将强制转换更改为 (BlockingQueue) ,但我收到了未经检查的案例警告(我已将其抑制)。我知道我可以做queue一个BlockingQueue<Runnable>但随后我必须在代码中的很多地方进行强制转换,但我不想这样做。

是否有我遗漏的东西,或者未经检查的警告是我最好的选择。

最佳答案

Java 中的参数化类型是不变的,这意味着 X<SubT>既不是 X<T> 的子类型,也不是父类(super class)型。您期望它们协变,这样 X<SubT>将是 X<T> 的子类型.

如果 Java 的泛型类型系统确实如此,那么它实际上是非常不切实际的,并且会导致类型不安全。例如,您的ThreadPoolExecutor想要一个BlockingQueue<Runnable>因为它可能会放置任何类型 Runnable进入它,不仅仅是你的MyRunnable s。不存在ThreadPoolExecutor<MyRunnable>这样的东西。 。

因此,如果您的期望是正确的,您将传入一个仅适用于 MyRunnable 的队列。 s,但会被要求排队,比如 TheirRunnable 。当该项目入队时,或者当它作为 MyRunnable 出队时,这必须中断。 .

关于Java BlockingQueue<Runnable> 不可转换类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25865910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com