Синтаксис такого назначения присваивания использует подстановочный знак:
List<SubClass> subs = ...;
List<? extends BaseClass> bases = subs;
Важно понимать, что List<SubClass>
не является взаимозаменяемым с List<BaseClass>
. Код, который сохраняет ссылку на List<SubClass>
, ожидает, что каждый элемент в списке будет SubClass
. Если другая часть кода относится к списку как List<BaseClass>
, компилятор не будет жаловаться, когда вставлены BaseClass
или AnotherSubClass
. Но это приведет к ClassCastException
для первого фрагмента кода, который предполагает, что все в списке является SubClass
.
Общие коллекции не ведут себя так же, как массивы в Java. Массивы ковариантны; то есть разрешено это делать:
SubClass[] subs = ...;
BaseClass[] bases = subs;
Это разрешено, потому что массив «знает» тип его элементов. Если кто-то пытается сохранить что-то, что не является экземпляром SubClass
в массиве (с помощью ссылки bases
), будет выведено исключение во время выполнения.
Общие коллекции do not «знают» свой тип компонента; эта информация «стирается» во время компиляции. Поэтому они не могут создавать исключение во время выполнения, когда происходит недопустимое хранилище. Вместо этого ClassCastException
будет поднят в некоторой далекой, трудно ассоциируемой точке в коде, когда значение будет считано из коллекции. Если вы прислушаетесь к предупреждениям компилятора о безопасности типов, вы избежите ошибок этого типа во время выполнения.
Пока что он работает только с процессорами AMD (забудьте о непонятном названии опции).
Изначально это только для процессоров AMD.
Все сообщения процессора Intel будут удалены / разделены.
blockquote>https://forums.virtualbox.org/viewtopic.php?f=1&t=90831
https: //forums.virtualbox .org / viewtopic.php е = 7 & амп;? Т = 90874
Насколько я понимаю, эта опция доступна только для процессоров AMD и не может быть включена на процессорах Intel. Это немного вводит в заблуждение, поскольку в этом варианте четко указаны технологии виртуализации Intel и AMD.
Я тоже жду, чтобы подтвердить этот ответ.