2014-09-02 2 views
0

Я пытаюсь сравнить два массива, используя метод Object equals, который я переопределяю. Я должен указать параметр объекта в ListInterface, и я не могу понять, что происходит. Любая помощь будет оценена по достоинству.Метод переопределения объекта

public class AList<T extends Comparable> implements ListInterface <T> { 

    private T[] list; 
    private int length; 
    private static final int MAX_SIZE = 50; 

    public AList() 
    { 
     this(MAX_SIZE); 
    } 
    public AList(int maxSize) 
    { 
     length = 0; 
     list = (T[]) new AList[maxSize]; 
    } 

    public boolean equals(Object other) 
    { 

     boolean results = true; 
     if (list.length == ((ListInterface<T>) other).getLength()) 
     { 
      for(int i = 0; i < list.length; i++) 
      { 
       if(list[i].equals((ListInterface<T>)other[i])) 
        results = true; 
      } 
     } 
     return results; 
    } 
+1

Просьба предоставить более подробную информацию о том, что не так или просто, как вы застряли. Обратите внимание, что сначала я должен проверить значение null, а затем проверить ссылочное равенство перед проверкой другого материала. то есть 'if (other == null) возвращает false;' и 'if (other == this) возвращает true;' Тогда я бы проверил instanceof * before * casting. –

+0

Является ли экземпляр AList предположительно равным экземпляру другого класса, который реализует ListInterface ? Это может нарушить инвариант .equals (Object o), что если a.equals (b) истинно, b.equals (a) также должно быть истинным. – Mshnik

ответ

0

И если other это неListInterface<T>? Что будет

myListInterface.equals(new StringBuilder()); 

делать? (Ответ, это бросает InvalidCastException или что-то). Кастинг способен только изменить тип вещей для примитивов, например. int до boolean Это не, способный изменять тип объектов. Приведение массива в список не делает его списком, оно просто делает его тем, что будет бросать ошибку каждый раз, когда вы пытаетесь вызвать метод списка, который у объекта отсутствует. Обычно это знак того, что у вас плохой полиморфный дизайн, но этот метод является исключением. Это означает, что вам нужно сначала использовать instanceof.

Переопределение equals сложно. Попробуйте автогенерировать один из Eclipse или IntelliJ, чтобы увидеть работу, которая входит в нее, или найти версию переопределения по умолчанию онлайн.

+0

вот несколько предложений от моего учителя. «Этот метод должен переопределить метод equals из класса Object. Заголовок метода должен отражать это, и вам нужно будет указать параметр из Object to ListInterface». Первый первый массив относится к классу AList, который реализует ListInterface . Второй массив был создан в основном тестовом тесте методами. Ниже приведены два массива, которые сравниваются. T [] list = (T []) новый AList [maxSize] AList другойNames = новый AList (); – user3242607

4

Похоже, ваш метод equals пытается проверить, содержат ли два массива, которые инкапсулируют объекты, те же объекты. Arrays.deepEquals (T [] t1, T [] t2) могут помочь.

public boolean equals(Object other) 
{ 
    if(other == null || ! (other instanceof AList<T>)) 
     return false; 
    AList<T> a = (AList<T>)other; 
    return Arrays.deepEquals(list, a.list); 
} 
Смежные вопросы