2016-09-30 4 views
2

У меня есть класс ShoppingCart, который использует ItemOrder объектов.Почему требуется тип Boolean return?

public class ShoppingCart extends ArrayList<ItemOrder> { 

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

public boolean add(ItemOrder order){ 
    if (super.indexOf(order) != -1){  //ITEM ALREADY IN LIST, REPLACE 
     super.remove(super.indexOf(order)); 
     super.set(super.indexOf(order), order); 
    } 
    else         //ITEM NOT IN LIST, ADD 
     super.add(order); 
    return true;       //TO SATISFY RETURN TYPE 
} 

Когда я написал метод, у меня не было типа возврата. Я получал ошибку, которая предполагала, что я установил тип возврата в пустоту, поэтому я сделал это. Затем я получил еще одну ошибку, возвращаемый тип должен быть логическим. Моя единственная проблема заключается в том, что сам метод по сути не является (по крайней мере для меня) истинным/ложным возвратом. Все, что мне нужно, это добавить/заменить объект в ArrayList, а не возвращать что-либо вообще.

Почему этот метод требует логического типа возврата, и я уверен, просто вбрасывая return true; в конце, или я должен использовать его для этого?

+6

Вы переопределение списка. add() и заставить его сделать что-то, что не соответствует контракту List.add(). Не делай этого. Не расширяйте ArrayList. Вместо этого ** используйте ** Список как поле ShoppingCart. ShoppingCart - это не список. Однако он может использовать список для хранения своих элементов. –

+3

Не ваш вопрос, но если вы делаете 'super.remove (super.indexOf (order));' то что такое indexOf в следующем выражении 'super.set (super.indexOf (order), order);'? –

+0

Чтобы уточнить: вы переопределяете метод, поскольку он имеет те же самые имена и те же типы параметров, что и [этот] (http://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html # надстройку E-). Вы пытались присвоить ему другой тип возвращаемого значения, но Java не рассматривает тип возвращаемого значения при принятии решения о том, переопределяет ли один метод другой. – ajb

ответ

7

Ваш метод add отменяет ArrayList.add который реализует Collection.add

Согласно Javadoc Collection.add

возвращает истину, если коллекция изменилась в результате вызова

См: https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#add(E) и https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#add(E)

+0

Вот что я получаю от изучения кода с youtube, lol. Так что мне нужно включить в Override аннотацию? Код отлично работает без него. Кроме того, могу ли я безопасно просто бросать в обратном? – Podo

+1

Нет, все будет в порядке без аннотации '@ override', но это хорошая практика, чтобы включить его для удобства обслуживания. Что касается 'return true ', тогда он может работать для вас сейчас, но если ваш код используется классом, который ожидает' ArrayList', и он что-то делает, когда 'add()' терпит неудачу или возвращает 'false', тогда этот класс будет ломать. Поэтому в целом при переопределении вы должны уважать контракт с переопределенным методом: верните true, если все это okey-dokey, false в противном случае. –

0

Представьте себе, что у вас есть ниже класс:

public class Example extends ArrayList<String>{ 

public boolean add(String order){ 
     if (super.indexOf(order) != -1){  //ITEM ALREADY IN LIST, REPLACE 
      super.remove(super.indexOf(order)); 
      super.set(super.indexOf(order), order); 
     } 
     else         //ITEM NOT IN LIST, ADD 
      super.add(order); 
     return true;       //TO SATISFY RETURN TYPE 
    } 

} 

Добавление метода public boolean add(String order){..}вы на самом деле переопределяем метод по умолчанию, что он содержится в ArrayList<String> классе.

Работа с IDE вы можете ясно видеть, что вы также должны @Override аннотацию так что это будет:

@Override 
    public boolean add(String order){ 
     if (super.indexOf(order) != -1){  //ITEM ALREADY IN LIST, REPLACE 
      super.remove(super.indexOf(order)); 
      super.set(super.indexOf(order), order); 
     } 
     else         //ITEM NOT IN LIST, ADD 
      super.add(order); 
     return true;       //TO SATISFY RETURN TYPE 
    } 

Также вы можете посмотреть на JavaDoc (https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#add-int-E-)