#java #class #casting #overloading
#java #класс #Кастинг #перегрузка #сравнение
Вопрос:
Я создаю отель, в котором мои клиенты хранятся в древовидной структуре, чтобы их можно было легко искать.
У меня есть два compareTo
метода для моего Client
класса. Один для сравнения Client
с другим Client
, а другой для сравнения с an int
. Client
должно быть типа Comparable
, потому что оно находится внутри древовидной структуры, которая реализует Comparable
.
//compare Client to int
public int compareTo(int arg0) {
int result = this.clientId.compareTo(arg0);
return resu<
}
//compare Client to object
public int compareTo(Object o) {
return (this.clientId).compareTo(((Client)o).clientId);
}
Но это не дает желаемого эффекта. Каждый раз, когда вызывается эта функция, она использует compareTo(Object)
метод и возвращает ошибку, к которой мой int
не может быть приведен Client
. Я полагаю, это потому Object
, что это суперкласс int
(?), Но не совсем понимаю, как это исправить. Я попытался обойти проблему, но, похоже, не могу ее исправить, не изменив весь свой код.
Комментарии:
1. Где код с проблемой?
2. Как говорит @akuzminykh, в показанном вами коде нет ничего принципиально неправильного. Нам нужно посмотреть, как вы пытаетесь его использовать — вот в чем проблема.
Ответ №1:
Java TreeMap
и TreeSet
используйте compareTo(T)
метод (т. Е. Для необработанных типов, которые вы, похоже, используете, compareTo(Object)
, поэтому ваш перегруженный метод просто игнорируется.
Хотя вы, конечно, можете перегрузить compareTo
метод, вы не можете заставить структуры данных Java использовать его.
Одним из возможных подходов может быть compareTo(Object)
использование метода для динамической проверки типа:
//compare Client to object
public int compareTo(Object o) {
Integer toCompare;
if (o instanceof Client) {
toCompare = ((Client) o).clientId;
} else if (o instanceof Integer) {
toCompare = (Integer) o;
} else {
throw new IllegalArgumentException();
}
return (this.clientId).compareTo(toCompare);
}