java - Java 中的扩展接口(interface)和转换错误

标签 java android

我正在尝试实现“PriorityThreadPoolExecutor”。

所以我声明执行者:

static ThreadPoolExecutor threadPool =  
                new ThreadPoolExecutor(2, 100, 100, TimeUnit.SECONDS, queue); 

优先级的关键是队列参数。基本上我需要一个 PriorityBlockingQueue 所以我使用构造函数:

PriorityBlockingQueue(int initialCapacity, Comparator<? super E> comparator);
queue = new PriorityBlockingQueue<mRunnable>(10,
        new Comparator<mRunnable>() {

            @Override
            public int compare(mRunnable lhs, mRunnable rhs) {
                return rhs.getPriority()-lhs.getPriority();
            }
        });

mRunnable 所在位置:

public interface mRunnable extends Runnable {
    public int getPriority();
}

但是编译器在这里提示:

Type mismatch: cannot convert from PriorityBlockingQueue<mRunnable> 
       to PriorityBlockingQueue <Runnable>

我不明白为什么当 mRunnable 扩展 Runnable 时会发生此错误。

我可以修补它改变比较器:

new Comparator<Runnable>() {

    @Override
    public int compare(Runnable lhs, Runnable rhs) {
        if (lhs instanceof mRunnable && rhs instanceof mRunnable){
        return ((mRunnable)rhs).getPriority()-((mRunnable)lhs).getPriority();
        }
        return 0;
    }
});

但恕我直言,这是一个丑陋的解决方案。

您能解释一下为什么会发生类型不匹配吗?谢谢

最佳答案

由于不同的泛型类型而发生类型不匹配,您应该将引用类型从 PriorityBlockingQueue<Runnable> 更改为至PriorityBlockingQueue <mRunnable> 。 或PriorityBlockingQueue<? extends Runnable>例如。

关于java - Java 中的扩展接口(interface)和转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12038043/

相关文章:

java.io.EOFException : Unexpected end of ZLIB input stream when using ByteArrayOutputStream in try-with-resources

java - 字符串未设置为正确的值

Java Github 存储库搜索

android - OnBoot Complete Dagger 2 不工作

java - 有没有办法确定 "main"是Android还是Java

android - 如何在 Android 中打开 excel 表?

android - 如何查看为 Android/SQLite 生成的 SQL 语句

java - 计算两点之间的距离 - Java

java - 在调用 Integer.parseInt 之前是否应该检查字符串是否为空?

java - Spring JDBC查询特定字段的计数