繁体   English   中英

如何使我的泛型代码与此方法签名兼容?

[英]How can I make my generics code compatible with this method signature?

我有以下代码的变体:

package com.test.package;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class TestClass {

    public static class MyRunnable implements Runnable {

        @Override
        public void run() {
            System.out.println("Called");
        }

    }

    public void method() {
        PriorityBlockingQueue<MyRunnable> queue = new PriorityBlockingQueue<MyRunnable>();
        method2(queue);
    }

    public void method2(BlockingQueue<? extends Runnable> queue) {
        System.out.println(queue);

        // Getting error here because BlockingQueue<? extends Runnable> is not a
        // subtype of BlockingQueue<Runnable>.
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(200, 200, 0L,
            TimeUnit.MILLISECONDS, queue);
    }
}

正如您所看到的,我的队列与ThreadPoolExecutor构造函数不兼容。 有没有办法解决这个问题,而不是将我的队列强制转换为(BlockingQueue<Runnable>) 我显然无法修补Java标准库。

不, 你不应该

当然,你的BlockingQueue<MyRunnable>应该只包含MyRunnable 但是ThreadPoolExecutor可以将任意Runnable任务提交给你给它的队列:请参阅execute(Runnable command)

如果发生这种情况,您的队列中可能会有一个非MyRunnable实例。 然后尝试从该队列的引用中进行轮询(键入为BlockingQueue<MyRunnable> ),并获取ClassCastException

简单的例子:

PriorityBlockingQueue<MyRunnable> queue = new PriorityBlockingQueue<>();
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(200, 200, 0L,
        TimeUnit.MILLISECONDS, queue);
threadPool.execute(new WhateverRunnable());
MyRunnable myRunnable = queue.poll(); // this could throw ClassCastException

如果queue.poll()在线程池有机会使WhateverRunnable实例出列之前发生,则上面的代码将抛出异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM