Беспорядок полиморфизма Java

Добавьте общедоступное поле public GameObject myPrefab; к своему монобихевому поведению.

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

Создайте его как Instantiate(myPrefab, transform.position, Quaternion.identity);

. Вам нужны только ресурсы. Загрузка, если ваш ресурс не существует во время компиляции. И, как сказано в документации, ресурсу.Load нужно, чтобы ресурс был в папке Resources.

https://docs.unity3d.com/ScriptReference/Resources.Load.html

8
задан Bill the Lizard 18 September 2012 в 03:13
поделиться

8 ответов

На самом деле это не относится к универсальным шаблонам, а относится к типам.

Легко представить себе, что ArrayList представляет собой List ], но List не обязательно является ArrayList .

ArrayList реализует интерфейс List , поэтому его можно рассматривать как ] Список . Однако только потому, что что-то реализует List , это не ArrayList . Например, LinkedList реализует List , но не является ArrayList .

Например, разрешено следующее:

List arrayList = new ArrayList();
List linkedList = new LinkedList();

Это потому, что оба ArrayList и LinkedList реализуют интерфейс List , поэтому оба они могут обрабатываться как List s.

Однако следующее не допускается:

ArrayList arrayList = new LinkedList();

Хотя оба ArrayList и LinkedList реализуют List , они не являются одним и тем же классом. Они могут иметь сходство, реализуя методы из List , но это полностью отдельные классы.

3
ответ дан 5 December 2019 в 06:54
поделиться

Тип возврата может быть ArrayList, но также не может быть ArrayList , это может быть LinkedList, оболочка списка коллекций или что-то еще. Чтобы присвоить его переменной, вы должны либо использовать тип самого высокого уровня, которым он может быть (в данном случае List), либо понижающий, если вы знаете, что должен быть ArrayList.

На практике переменные почти всегда следует вводить как Список (если не Коллекция). Практически никогда не бывает веских причин для ссылки на конкретный тип для этих классов.

3
ответ дан 5 December 2019 в 06:54
поделиться

Когда вы указываете возвращаемый тип List, вы говорите, что возвращение может быть любым типом List, будь то ArrayList, LinkedList или другой тип. списка. Если вы пытаетесь вернуть ArrayList, вы слишком конкретны - это уже не общий список.

3
ответ дан 5 December 2019 в 06:54
поделиться

Поскольку ArrayList является подклассом List, поэтому не гарантируется, что список, возвращаемый процессом, будет ArrayList. Например, это может быть LinkedList.

13
ответ дан 5 December 2019 в 06:54
поделиться

Вы можете объявить возвращаемый тип ArrayList , но для этого потребуется явное приведение, например:

ArrayList output = null;
output = (ArrayList)process(input);

... что противоречит тому, что позволяют генерики.

1
ответ дан 5 December 2019 в 06:54
поделиться

Метод process не сможет решить, какую конкретную реализацию List выбрать. Его подпись дает вам обещание, что он сможет работать с ЛЮБЫМ списком (ArrayList, LinkedList и т.д.) и может только указать, что возвращаемое значение будет НЕКОТОРЫМ списком.

Например, если возвращенный объект является LinkedList, вы не можете назначить его напрямую переменной, объявленной как ArrayList, но вы можете рассматривать его как List. Следовательно, А. и Д. неверны. Вы не можете объявить свою переменную как ArrayList.

1
ответ дан 5 December 2019 в 06:54
поделиться

Это потому, что вопрос явно говорит, что метод возвращает List . Вы вполне можете изменить определение метода, чтобы он возвращал ArrayList , но это другой вопрос. List может быть списком разных типов.

0
ответ дан 5 December 2019 в 06:54
поделиться

Другой способ взглянуть на это - «совместимость назначений». Семантически вызов метода

output = process(input)

эквивалентен

nums = input;
/* body of process... */
output = returnVal; /* where process exits with "return returnVal" */

. Мы знаем, что nums имеет тип List , поэтому тип input должен быть "назначаемый" в Список . Аналогичным образом, мы знаем, что returnVal (т.е. возвращаемое значение процесса ) типа List , поэтому List должен быть «назначен» типу выхода .

В общем, тип T «присваивается» типу U , если T является подтипом U (включая случай, когда T и U одинаковы).

Следовательно, тип входа должен быть Список или подтип List (например, ArrayList или LinkedList ). Точно так же тип вывода должен быть List или супертип из List (например, Коллекция или даже Объект ).

0
ответ дан 5 December 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: