使用泛型和Java8 Streams未经检查的调用错误

时间:2017-03-22 16:28:49

标签: java generics java-8

我的IDE发出了一个奇怪的警告,但代码仍然正常运行。

代码是

class TaskQueue<T extends Comparable> {
    private final PriorityQueue<QueueItem<T>> queue = 
            new PriorityQueue<>(Comparator.comparing(QueueItem::getDeadline));
}

IDE给了我一个警告和错误:

  • 警告
    Unchecked call to 'PriorityQueue(Comparator<? super E>)' as a member of raw type 'java.util.PriorityQueue'

  • 错误引用QueueItem::getDeadline
    Non-static method cannot be referenced from a static context

我是Java的新手,尽管代码有效,但我想知道我是否可以用更好的方式编写它,或者是否有正确的方法。

谢谢

修改

QueueItem

的代码
class QueueItem<T extends Comparable>{
    private final T deadline;

    QueueItem(T deadline) {
        this.deadline = deadline;
    }


    T getDeadline() {
        return deadline;
    }
}

2 个答案:

答案 0 :(得分:2)

不应该QueueItem看起来有点不同(TaskQueue也是如此):

 QueueItem<T extends Comparable<T>>

注意T extends Comparable<T>

Comparable是一种泛型类型,但在您的代码中,您没有指定Comparable的类型;相反,它是原始的。

答案 1 :(得分:1)

方法QueueItem::getDeadline返回某种未实现Comparable的对象。

所以解决方案将是:

class Deadline implements Comparable<Deadline> {

    @Override
    public int compareTo(Deadline o) {
        return 0 /* Some comparing logic here */;
    }

}

Comparator.comparing期望返回Comparable个对象。