为什么不编译关于Java可比对象的信息?

时间:2019-06-10 18:31:54

标签: java

我想使用堆来实现优先级队列。队列将存储类型为Entry:K V的对象,其中K和V为键/值对。但是我很难使用我在Entry类中实现的compareTo方法。它不会编译。

public class Entry <K extends Comparable,V> implements Comparable<Entry>{
    K key;
    V value;

    public int compareTo(Entry other) {
        return key.compareTo(other.key);
    }
}


public class PQ <Entry>{
    Object[] queue;

    public int compareEntries(Entry e1, Entry e2) {
             return (e1.compareTo( e2));
    }
}

在最后一行(e1.compareTo(e2))中,compareTo被突出显示,并且不会编译。它要求我强制转换e1,但会自动广播为废话。但是我不明白为什么它无法编译。

2 个答案:

答案 0 :(得分:0)

问题是这样的:

public class PQ <Entry>{

这将“ Entry”声明为泛型类型的占位符,并且指定您要使用Entry类。您想完全删除<Entry>,或者,如果需要将其删除,请执行以下操作:

public class PQ <T extends Entry>{
  Object[] queue;

  public int compareEntries(T e1, T e2) {
    return (e1.compareTo( e2));
  }
}

然后,当您创建类的实例时,可以执行以下操作:

PQ<Entry> pq = new PQ();

但是除非您需要PQ接受比Entry更多的类型,否则更好的解决方案是完全删除<Entry>部分,以便您的类定义很简单:

public class PQ {

答案 1 :(得分:0)

您没有使用您认为自己的“条目”。

class PQ <Entry>

您正在创建一个名为“ Entry”的新通用类型参数。由于它是无限制的,因此您通常在人们通常使用T(代表“类型”)时使用此标识符。您的泛型类型参数与类的名称相同的事实纯粹是偶然的。

您可能想要这样的东西:

public class PQ <K extends Comparable<K>, V>{
    Object[] queue;

    public int compareEntries(Entry<K, V> e1, Entry<K, V> e2) {
             return (e1.compareTo( e2));
    }
}

您的Entry类也可能是错误的。你可能想要

public class Entry <K extends Comparable<K>,V> implements Comparable<Entry<K, V>>{

请注意,任何给定的条目只能与具有相同类型的条目“ 仅可比较”。因为如果键的类型不同,如何比较两个条目?你如何比较一个整数和一个字符串?字符串和布尔值?等