У меня есть класс, который принимает общий тип, и я хочу переопределить метод equals
не-неудобным способом (т.е. то, что выглядит чисто и имеет минимальный объем кода, но для очень общего использования).
Сейчас у меня есть что-то вроде этого:
public class SingularNode<T> {
private T value;
@SuppressWarnings("unchecked")
@Override
public boolean equals(Object other){
if(other instanceof SingularNode<?>){
if(((SingularNode<T>)other).value.equals(value)){
return true;
}
}
return false;
}
}
Что, я предполагаю, довольно ошибочен - я делаю приведение к SingularNode<T>
объекта other
, что потенциально может вызвать ошибку.
Другое дело - когда я делаю if(other instanceof SingularNode<?>)
, я на самом деле не проверяю правильную вещь. Я действительно хочу проверить тип T
, а не тип ?
. Всякий раз, когда я пытаюсь сделать ?
в T
, я получаю некоторую ошибку, например:
Невозможно выполнить проверку экземпляра с параметризованным типом
SingularNode<T>
. Вместо этого используйте формуSingularNode<?>
, так как дополнительная информация о типовом типе будет стерта во время выполнения
Как я могу обойти это? Есть ли способ сделать T.class.isInstance(other);
?
Я полагаю, есть одно действительно уродливое решение для взлома:
@SuppressWarnings("unchecked")
public boolean isEqualTo(Class<?> c, Object obj){
if(c.isInstance(obj) && c.isInstance(this)){
if(((SingularNode<T>)obj).value.equals(value)){
return true;
}
}
return false;
}
Но это просто выглядит неудобно с дополнительным параметром метода, а также не встроенная функция типа equals
.
Любой, кто разбирается в дженериках, объясните это? Я не настолько разбираюсь в Java, как вы можете ясно видеть, поэтому, пожалуйста, объясните немного подробнее!