2015-06-02 2 views
1

У меня есть класс, получающий 2 неизвестных, общих объекта x и y. Я должен сравнивать их с объектами, если они сопоставимы. Я понял, что я могу проверить, если объекты реализует интерфейс Comparable с помощью instanceof, но я не знаю, как я могу использовать метод .compareTo хотя я знаю, что объект реализует сам поИспользовать известные методы общих объектов

То, что я хочу сделать, это в основном это с x и y являются универсальными Объектами:

public void someMethod(E x, E y) { 
    if (x instanceof Comparable && y instanceof Comparable) { 
     if(x.compareTo(y) < 0){ //The method compareTo(E) is undefined for the type E 
      //do stuff 
     } 
    } 
} 

Может ли кто-нибудь указать мне в правильном направлении?

ответ

0

После проверки вы можете (и должны) безопасно использовать объекты, чтобы использовать их по мере необходимости.

if (x instanceof Comparable && y instanceof Comparable) { 
    Comparable c1 = (Comparable) x; 
    Comparable c2 = (Comparable) y;   
    if(c1.compareTo(c2) < 0){ 
     //do stuff 
    } 
} 
+0

Я не знал, что возможно литье в интерфейс, спасибо! Правильный ответ, так как я не знал, является ли обобщающий элемент имплантированием Comparable. –

+1

необработанные типы не должны использоваться – newacct

3

Необходимо указать общий тип привязки. Сейчас E может быть любой Object типа, но это выглядит, как вы хотите, чтобы ограничить его к любому типу, который реализует Comparable, который будет выглядеть так:

public <T extends Comparable<? super T>> void someMethod(T x, T y) { 
    if (x.compareTo(y) < 0) { 
     //do stuff 
    } 
} 

Альтернативного ответы, которые предполагают отливку являются правильными, но не приятно Решение: если вы знаете, что «x» и «y» реализуют Comparable, вы должны ограничить их как таковые.

+1

для наилучших результатов использовать '>' – newacct

1

Вы должны объявить метод как

public <E extends Comparable<E>> void someMethod(E x, E y) 

так в вашем методе вы можете быть уверены, использовать метод CompareTo.

+1

Хорошо, но похоже, что у него есть тип '' '' '' '', связанный уже на уровне класса, и поэтому имея один для someMethod собирается затенять другого (что не очень приятно и часто запрещено в стилях кодирования). Простое изменение '' 'E''' на другой идентификатор (например,' '' T''') исправит это. – Toby

+0

@Toby Хорошая точка. Ты выглядишь ближе, чем я;) –

Смежные вопросы