簡體   English   中英

在界面中實現Comparable

[英]implementing Comparable in an interface

我只使用它的接口調用一個特定的類。 問題是,類本身實現了Comparable,但由於我通過不同的接口引用該類,因此編譯器不知道它實現了Comparable。 我確信有一個簡單的解決方案......但我現在想不到它。

實現接口的所有內容是否也會實現Comparable<T> 如果是這樣,我建議你只需使接口擴展Comparable<T>

否則,如果您碰巧知道在這種情況下它會起作用,您可以轉換為Comparable<T> 當然,這會失去一些編譯時類型的安全性,但這就是野獸的本質。

這對我來說似乎很奇怪......如果你有像下面這樣的主要內容,你可以使用下面的Parent接口和子類...但是有一個奇怪之處在於你可以嘗試將ChildA與ChildB進行比較做起來可能沒有意義。

也許如果你給我們提示類/接口正在做什么,我們可以給出更好的答案。

public class Main
{
    public static void main(final String[] argv)
    {
        Parent x;
        Parent y;

        x = new ChildA();
        y = new ChildA();
        x.compareTo(y);
    }
}

abstract interface Parent
    extends Comparable<Parent>
{
}

class ChildA
    implements Parent
{
    public int compareTo(Parent o)
    {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

class ChildB
    implements Parent
{
    public int compareTo(Parent o)
    {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

我建議你改用Comapartor。 您可以使用sort(list,Comparator)。 您的比較器實現將類轉換為Comparable並使用其compare方法。 因此編譯器將得到滿足,您將重用比較方法的現有實現。

你可以做一些怪異的泛型。 假設主界面是Lickable (它定義了一個方法lick() ),你想要一個處理LickableComparable對象的方法。 你寫:

public <LickableAndComparable extends Lickable & Comparable<LickableAndComparable>> void lickGreater(LickableAndComparable a, LickableAndComparable b) {
    if (a.compareTo(b) > 0) a.lick();
    else b.lick();
}

然后,您可以使用任何類型的LickableComparable對象來調用它。 請注意,只有當兩個參數共享一個既可Lickable Comparable自身Comparable的類型時,它才有效。 如果你只考慮一個班級,那么這應該沒問題。 如果您對方法的使用變得復雜,您可能會遇到導致偏頭痛的編譯器錯誤。

可比較的接口很棘手。 通常,如果將接口標記為自身可比較,則任何正確的實現都只能使用此接口中的方法來執行比較。 否則這種關系不能反對稱 - 這是一致排序的必要條件。

因此,在將界面標記為可比較之前請三思。

但是,如果您確定沒有混合接口的不同實現,則可以使用一種解決方法:

interface Foo {
}

interface Bar extends Foo, Comparable<Bar> {
}


class FooComparator<T extends Foo & Comparable<T>> implements Comparator<T> {

    @Override
    public int compare(T arg0, T arg1) {
        return arg0.compareTo(arg1);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM