Расширение ArrayList и создание новых методов - PullRequest
5 голосов
/ 29 июня 2011

У меня возникли некоторые проблемы с пониманием чего-либо - возможно, я поступаю по этому поводу совершенно неправильно.

Я пытаюсь создать класс, который расширяет ArrayList, но имеет несколько методов, которые увеличивают функциональность (вминимум для программы, которую я разрабатываю.)

Одним из методов является findById (int id), который ищет в каждом объекте ArrayList конкретное совпадение идентификатора.Пока это работает, но не позволяет мне делать for (Item i : this) { i.getId(); }

Я не понимаю, почему?

Полный код:

public class CustomArrayList<Item> extends ArrayList<Item> {

    // declare singleton instance
    protected static CustomArrayList instance;

    // private constructor
    private CustomArrayList(){
        // do nothing
    }

    // get instance of class - singleton
    public static CustomArrayList getInstance(){
        if (instance == null){
            instance = new CustomArrayList();
        }
        return instance;
    }

    public Item findById(int id){
        Item item = null;
        for (Item i : this) {
            if (i.getId() == id) {
                      // something
         }
        }
        return item;
    }
    public void printList(){
        String print = "";
        for (Item i : this) {
            print += i.toString() + "\n";
        }
        System.out.println(print);
    }
}

Ответы [ 2 ]

7 голосов
/ 29 июня 2011

Изменить

public class CustomArrayList<Item> extends ArrayList<Item> {

на

public class CustomArrayList extends ArrayList<Item> {

Я подозреваю, Item - это имя класса, который вы хотите сохранить в списке.Добавляя <Item> после CustomArrayList, вы вводите параметр типа , который скрывает этот класс.код равен

public class CustomArrayList<T> extends ArrayList<T> {
    // ...
        for (T i : this) { i.getId(); }
    // ...
}

, что, очевидно, не всегда работает, так как T может относиться к любому типу.

2 голосов
/ 29 июня 2011

Что такое getId()?Предположительно, это метод в некотором классе, но мы не знаем какого класса.

Если у вас действительно есть класс с именем Item с *Метод 1009 *, который должен быть списком, вам просто нужно помешать вашему классу быть универсальным.Поэтому вместо этого:

public class CustomArrayList<Item> extends ArrayList<Item> {

вы хотите:

public class CustomArrayList extends ArrayList<Item> {

В настоящее время в вашем классе Item не относится к классу с именем Item, он относится к введите параметр под названием Item.

Теперь лично:

  • Я бы не стал создавать синглтоны, если вам действительно не нужно
  • Если у вас естьк тому, я бы не стал создавать их так, как у вас (что не является потокобезопасным)
  • Я бы не стал расширять ArrayList<>, если бы мне не пришлось, предпочитая композицию наследованию
...