Как реализовать метод «равно» для дженериков, используя «instanceof»?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как реализовать метод «равно» для дженериков, используя «instanceof»?

Сообщение Anonymous »

У меня есть класс, который принимает обобщенный тип, и я хочу переопределить метод равенства неудобным способом (т. е. чем-то, что выглядит чистым и имеет минимальное количество кода, но для очень общего случая использования).

Сейчас у меня есть что-то вроде этого:

Код: Выделить всё

public class SingularNode {
private T value;

@SuppressWarnings("unchecked")
@Override
public boolean equals(Object other){
if(other instanceof SingularNode){
if(((SingularNode)other).value.equals(value)){
return true;
}
}
return false;
}
}
Что, я думаю, довольно ошибочно — я выполняю приведение к SingularNode на другом объекте, что потенциально может выдать ошибку.

Другое: когда я делаю if(other instanceof SingularNode), я на самом деле проверяю не совсем то, что нужно. На самом деле я хочу проверить тип T, а не тип ?. Всякий раз, когда я пытаюсь превратить ? в T, я получаю ошибку типа:


Невозможно выполнить проверку экземпляра параметризованного типа SingularNode. Вместо этого используйте форму SingularNode, поскольку дальнейшая информация об общем типе будет удалена во время выполнения.


Как это обойти? Есть ли какой-нибудь способ сделать T.class.isInstance(other); ?

Я полагаю, есть одно действительно уродливое хакерское решение, подобное этому:

Код: Выделить всё

@SuppressWarnings("unchecked")
public boolean isEqualTo(Class c, Object obj){
if(c.isInstance(obj) && c.isInstance(this)){
if(((SingularNode)obj).value.equals(value)){
return true;
}
}
return false;
}
Но это выглядит очень неловко с дополнительным параметром метода, и к тому же это не встроенная функция, такая как Equals.

Кто-нибудь, кто разбирается в дженериках, объясните это? Как вы можете ясно видеть, я не очень хорошо разбираюсь в Java, поэтому, пожалуйста, объясните немного подробнее!

Подробнее здесь: https://stackoverflow.com/questions/163 ... instanceof
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»