Реализация наследования ArrayList - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть интерфейс SortingToolTemplate, который содержит ArrayList в качестве переменной экземпляра.

Поскольку у меня будет много классов, реализующих этот интерфейс, но с разными типами данных для ArrayList, я объявил это так:

ArrayList<Object> data = null;

Таким образом, каждый класс может создавать его как:

data = new ArrayList<Integer>(); OR data = new ArrayList<String>(); 

et c ...

Когда я это делаю, я получаю сообщение об ошибке "1013 *" в моей IDE, но если я удаляю эту строку, я могу использовать ArrayList даже без создания экземпляра Это.

Кто-нибудь знает, почему это происходит?

РЕДАКТИРОВАТЬ

Код интерфейса:

interface SortingToolTemplate {

ArrayList<Object> data = null;

int getMax();
int getMaxOccurrence(int max);
void getData();
void showResult();
int getMaxPercentage();

}

Один из кодов классов (еще не реализован, но уже показывает ошибку):

public class WordSort implements SortingToolTemplate {

data = new ArrayList<String>();

@Override
public int getMax() {
    return 0;
}

@Override
public int getMaxOccurrence(int max) {
    return 0;
}

@Override
public void getData() {

}

@Override
public void showResult() {

}

@Override
public int getMaxPercentage() {
    return 0;
}

}

Ответы [ 4 ]

1 голос
/ 10 февраля 2020

Здесь происходит две отдельные проблемы.

[1] Вы не можете помещать случайные операторы в классы или интерфейсы; внутри класса или интерфейса вы можете помещать только поля, методы, конструкторы, (stati c) инициализаторы и определения других типов. Вы добавляете утверждение (list = new ArrayList<String>();) - вы не можете этого сделать. Переместите это в конструктор или просто инициализируйте его прямо вверх: List<String> list = new ArrayList<String>();)

[2] вы не можете назначить список строк списку объектов, потому что они не совпадают. Вы можете добавить целое число в список объектов (потому что целое число - это объект), но теперь в списке строк есть целое число, поэтому java не позволит вам. Исправление должно иметь List<?> list = new ArrayList<String>();, что хорошо, но учтите, что вы ничего не можете добавить к List<?>. (кроме нуля).

Что вы, вероятно, хотите, это что-то вроде:

public class WordSort<E> implements SortingToolTemplate {
    private List<E> list = new ArrayList<E>();
}

обратите внимание также, что вы не можете вообще объявлять поля в интерфейсах. Может показаться, что вы можете, но вы объявляете константу (они публикуются c, stati c и final, даже если вы этого не говорите). Это не то, для чего нужны интерфейсы.

0 голосов
/ 10 февраля 2020

Строка - это Объект, но Объект должен быть Строкой. Вот почему: List list = new ArrayList () или new ArrayList () не работает.

Если вы посмотрите на класс ArrayList, вы увидите, что он использует Generics. Некоторые ребята предложили и создали какой-то код для вас. Вы должны следовать.

У меня есть кое-что, что может вам помочь: Сортировка списка

0 голосов
/ 10 февраля 2020

Вам необходимо параметризовать ваш интерфейс. Вот упрощенный пример:

public interface MyInterface<T> {
...
  List<T> getList();
}

public class MyFirstImplementation implements MyInterface<Integer> {
  private List<Integer> myList = new ArrayList<>();

  @Override 
  public List<Integer> getList() {
    return myList;
  }
}

public class MySecondImplementation implements MyInterface<String> {
  private List<String> myList = new ArrayList<>();

  @Override 
  public List<String> getList() {
    return myList;
  }
}
0 голосов
/ 10 февраля 2020

Я не знаю, что происходит с вашим кодом, но я бы использовал дженерики вместо Object.

Я бы также использовал List с левой стороны, чтобы кто-то мог использовать другую реализацию, например, LinkedList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...