[英]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()
),你想要一個處理Lickable
和Comparable
對象的方法。 你寫:
public <LickableAndComparable extends Lickable & Comparable<LickableAndComparable>> void lickGreater(LickableAndComparable a, LickableAndComparable b) {
if (a.compareTo(b) > 0) a.lick();
else b.lick();
}
然后,您可以使用任何類型的Lickable
和Comparable
對象來調用它。 請注意,只有當兩個參數共享一個既可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.