2015-06-08 2 views
2

У меня есть контейнер, который может сохранять значения разных типов, реализующих интерфейс Comparable. Мне нужно сравнить эти значения следующим образом:Как сравнить два значения в Java

UpperLowerContainer values; 
//initializing the container 
Comparable<?> upper = (Comparable<?>) values.getUpper(); 
Comparable<?> lower = (Comparable<?>) values.getLower(); 
if (upper.compareTo(lower) < 0){ //This is not compiled 
    //do some 
} 

Код не скомпилирован по понятной причине. Захват подстановочного знака lower не может быть применен к захвату 's wildacrd и наоборот.

Но как я могу решить эту проблему? Есть идеи?

UPD: Тип значений, хранящихся в контейнере, одинаковый. Перед хранением в нем есть подтверждение.

+0

Сопоставимые верхние = (Сопоставимые ) значения. getUpper(); \t \t Сопоставимый lower = (Сопоставимый ) values.getLower(); try casting как будто (upper.compareTo ((CLASSNAME) ниже) –

+0

имя класса может быть дата, а также целое число – user3663882

+0

Я не уверен, что то, что вы просите, возможно. Вы просите сравнить потенциально несравнимые объекты Вместе с тем, если еще один код завершит проблему, так как, пока я думаю, что другие ответы касаются компиляции, они не оспаривают проблему с корнем. – Makoto

ответ

0

Как выглядит ваш класс UpperLowerContainer? Вы можете использовать аргументы типа, так что вам не нужно использовать подстановочные знаки и броски. Например:

public class UpperLowerContainer<T extends Comparable<T>> { 

    private final T lower; 
    private final T upper; 

    public UpperLowerContainer(T lower, T upper) { 
     this.lower = lower; 
     this.upper = upper; 
    } 

    public T getLower() { 
     return lower; 
    } 

    public T getUpper() { 
     return upper; 
    } 
} 

И потом:

Comparable<T> upper = values.getUpper(); 
Comparable<T> lower = values.getLower(); 
if (upper.compareTo(lower) < 0) { 
    // do something 
} 

Причина, почему он не работает то, потому что компилятор не может быть уверен, что эти две маски в этих строках относятся к тому же типу:

Comparable<?> upper = (Comparable<?>) values.getUpper(); 
Comparable<?> lower = (Comparable<?>) values.getLower(); 

Если вы звоните compareTo на одном из этих сопоставимых, вы должны передать его значение того же типа. Однако, поскольку тип типа неизвестен, компилятор не может проверить, передаете ли вы значение правильного типа, чтобы вы получили сообщение об ошибке.

+0

это просто контейнер, возвращающий 'Object'. Я не могу измените его так, как вы предложили. – user3663882

+0

Возможно, я совершил архитектурную ошибку и попал в эти неприятности.Есть ли способ сделать это без изменения контейнера? – user3663882

+0

Что именно означают 'values.getUpper()' и 'values.getLower()' return? Необработанный тип 'Comparable'? Вы можете попробовать использовать 'Comparable ' вместо 'Comparable '. – Jesper

0

Данный код не будет компилироваться, пока вы не укажете тип объекта. Вы не можете использовать дикие карты, которые вы пытаетесь использовать. класс декларация должна быть:

public class UpperLowerContainer<T extends Comparable<T>> 

и вы должны использовать как

Comparable<T> upper = values.getUpper(); 
Comparable<T> lower = values.getLower(); 

теперь вы код

if (upper.compareTo(lower) < 0) { 
    // do something 
} 

компилирует

+0

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

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