Почему это назначение не работает?

#java

#java

Вопрос:

У меня есть класс, Results который extends ArrayList<Results> . У меня есть объект, i у которого есть функция i.getResults() , которая возвращает ArrayList тип ArrayList<Results> of. Я пытаюсь выполнить следующее:

 Results result = i.getResults();
  

Однако я получаю ошибку несоответствия типов. Почему я не могу выполнить это назначение? Как я могу назначить его для ввода результатов?

РЕДАКТИРОВАТЬ: Чтобы объяснить, чего я пытаюсь достичь.. У меня нет доступа к ArrayList<Results> коду, и я хотел бы заставить его реализовать определенный класс, который я Results реализовал

Комментарии:

1. Важно иметь четкое представление о том, чего вы пытаетесь достичь. Можете ли вы описать по-английски, что вы действительно пытаетесь здесь сделать.

2. Хорошо, теперь представьте, что вы объясняете это кому-то нетехническому. Кстати: ArrayList<Results> это просто код, к ArrayList которому у всех есть доступ.

Ответ №1:

Вы не можете — ArrayList<Results> не является Results . Results это ArrayList<Results> хотя, вы могли бы назначить другим способом.

Комментарии:

1. Ну, мне нужно что-то реализовать в типе ArrayList<Результаты>, но у меня нет кода для этого класса. Как бы мне это сделать?

2. Создайте класс-оболочку вместо расширения.

3. Один из вариантов — предоставить результатам конструктор, который принимает ArrayList<Результаты>

4. Результат (коллекция<? расширяет результаты> результаты) { super (results); }, вероятно, справился бы с этой задачей.

5. @jeff Ты уверен, что имел в виду это для расширения результатов? возвращает значение undefined.

Ответ №2:

Вы назначаете родительский элемент дочернему классу. Это невозможно. Вы можете назначить do

 ArrayList<Result> list = new Results();
  

Ответ №3:

У вас неправильная взаимосвязь.

 class T {}
class S extends T {}
  

В LSP указано, что:

в компьютерной программе, если S является подтипом T, то объекты типа T могут быть заменены объектами типа S (т. Е. объекты типа S могут заменять объекты типа T), без изменения каких-либо желательных свойств этой программы (корректность, выполняемая задача и т.д.).

Другими словами, любое место, которое ожидает a, T может получить S an без проблем. Чему-то, что требует, S не может быть предоставлено T , потому что это недостаточно конкретно.

В вашем примере i.getResults() возвращает ArrayList<Results> . Вы не можете назначить это для, Results потому Results что оно более специфично, чем список массивов.

Ответ №4:

У вас есть

   Results extends ArrayList<Results>
  

Таким образом, везде, где вы могли бы использовать ArrayList, вы можете использовать результаты, но не наоборот. Когда вы говорите
расширяет вы говорите, что я могу делать все, что он может делать, и немного больше.

   C extends D
  

говорит: если все, что вам нужно, это D, то вы можете использовать либо C, либо D. Но кто-то, нуждающийся в C, не может принять D, потому что у него нет всех возможностей, предлагаемых C.

Ответ №5:

Ну, вы пытаетесь присвоить объекту типа суперкласса ссылку типа подкласса, и, конечно, это ошибка времени компиляции, потому что она может быть недопустимой. Это то же самое, как если бы вы попытались присвоить возвращаемое значение метода, который возвращает Object переменную типа String . Если вы абсолютно уверены, что getResults() метод возвращает Results объект, вам следует изменить его возвращаемый тип. Или, если вы уверены в этом только в данном контексте, вы можете использовать приведение.