[英]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.