【问题标题】:Compiler thinks Comparable type is not Comparable编译器认为 Comparable 类型不是 Comparable
【发布时间】:2014-05-02 02:31:41
【问题描述】:

所以我有一个实现 Comparable 的类(为简洁起见,我在这里有一个虚拟方法)

public class MarkovEntry<T extends Chainable> implements Comparable<MarkovEntry<T>>
{
    // Compare two rows by ID
    public int compareTo(MarkovEntry<T> e)
    {
        return 0;
    }
}

另一个类中的方法采用 Comparable(再次,虚拟方法)

public class ArrayOps
{
    public static int binSearch(ArrayList<Comparable> list, Comparable c)
    {
        return 0;
    }
}

当我尝试如下调用我的方法时

int index = ArrayOps.binSearch(entries, newEntry);

其中 entries 是 MarkovEntry 的 ArrayList,newEntry 是 MarkovEntry,编译器告诉我

actual argument java.util.ArrayList<com.company.MarkovEntry<T>> cannot be converted 
to java.util.ArrayList<java.lang.Comparable> by method invocation.

这里发生了什么? MarkovEntry 专门实现了 Comparable——为什么编译器不能识别?

我的类 Chainable 也实现了 Comparable,以防万一与它有关。

【问题讨论】:

    标签: java generics interface comparable


    【解决方案1】:

    泛型有点奇怪

    ArrayList<SuperType>
    

    实际上并不是

    的超类型
    ArrayList<SubType>
    

    例如ArrayList&lt;Number&gt; 不是 ArrayList&lt;Integer&gt; 的超类型。这是因为如果这样的关系成立,您可以用 ArrayList&lt;Number&gt; 替换 ArrayList&lt;Integer&gt;,这将允许如果您不进行替换则可能会非法的操作。

    更具体地说,假设您这样做了:

    ArrayList<Number> list = new ArrayList<Integer>();
    

    然后您可以将Double 放入list,因为对于编译器,listArrayList&lt;Number&gt;!如您所见,这破坏了泛型应提供的保证,因此是不允许的。


    您正在寻找的是这样的通用方法

    public static <T extends Comparable<? super T>> int binSearch(ArrayList<T> list)
    

    基本上,您可以像生成类一样生成方法。

    更多信息可以在这里找到:http://docs.oracle.com/javase/tutorial/extra/generics/methods.html

    【讨论】:

    • 这里不需要泛型方法;只需使用wildcardint binarySearch(ArrayList&lt;? extends Comparable&gt; list)
    • 等等,Comparable 不需要参数化吗?
    • 为了获得最佳效果,请使用&lt;T extends Comparable&lt;? super T&gt;&gt;
    • binSearch(ArrayList&lt;? extends Comparable&lt;?&gt;&gt; list) 不是类型安全的
    • @newacct 我知道有些东西不见了...谢谢!
    猜你喜欢
    • 2021-05-17
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多