簡體   English   中英

如何使對象具有可比性

[英]How to make objects comparable

我有一個類,它包含不同的類型並實現Iterable<Object>接口。 但是對我來說很重要,我可以比較元素。 我知道,我不能寫類似: Iterable<Object & Comparable<?>> ,那我該怎么辦?

我已確保類中包含的每個元素:

  • 不能為null
  • 與同類元素相當。
  • 是一成不變的。 好吧,至少我正在檢查一部分。

不是那樣,我只想比較元素,因為我可以這樣:

private static int hackCMP(Object val, Object val2)
        throws SecurityException, NoSuchMethodException,
        IllegalArgumentException, IllegalAccessException,
        InvocationTargetException {
    Method m = val.getClass().getMethod("compareTo", val.getClass());
    return (Integer) m.invoke(val, val2);
}

我想將元素作為輸入傳遞給另一個類的間接構造函數,這也確保元素需要具有可比性。 該方法是:

public static <T extends Comparable<?>> Os of(final Iterator<T> values) {

Dave Costa指出以上觀點,您實際上應該只使用Iterator<Comparable<?>>而不要在其中使用Object 您的類型應根據需要確定。 如果您有期望Comparable<?> ,請使用它。 接受Object的方法無論如何都可以采取任何措施,包括Comparable

你可以寫

public static <T extends Object & Comparable<?>> Os of(final Iterator<T> values) {

那是你的問題嗎?

編輯:如果您想假定對象是可比較的,則可以執行此操作。

public static int compare(Object o1, Object o2) {
    return ((Comparable) o1).compareTo((Compareable) o2);
}

最好使用的是<T extends Comparable<? super T>> <T extends Comparable<? super T>>

您需要在其中有第二個T ,因為當您有T extends Comparable<?>時,它會T extends Comparable<?> ,實際上並不能確保類型與自身可比。 您可能認為這很愚蠢,但是我很可能使Foo implements Comparable<String>Foo implements Comparable<String> ,因此Foo對象無法與其自身進行比較。 如果沒有第二個T ,您將無法保證該對象與其自身進行比較,並且必須強制轉換或使用原始類型或不安全的類型才能傳遞該對象。

? super ? super有點微妙。 考慮可比較類的子類時,它是必需的。 例如,如果A implements Comparable<A> ,而B extends A ,則B implements Comparable<A>自動B implements Comparable<A>B無法implement Comparable<B>因為它只能實現一次接口)。 因此,為了使B能夠與您的設計一起使用, Comparable的參數應為? super T ? super T而不只是T以使其成為T的超類。

暫無
暫無

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

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