PDA

Просмотр полной версии : Несоответствие типов


Appleman
18.09.2018, 19:05
Друзья, помогите, плиз. Столкнулся сегодня с непонятной мне проблемой.
Имею вот такие присвоения:

public class ActionEntity extends EventDispatcher
{
protected var _recipientMiscEffects: Vector.<CUEntity> = new Vector.<CUEntity>; // Вектор прочих обновлений реципиента в формате CharacterUpdates

public function execute() : void // Запуск действия
{
if (_contact.recipientReadyUpdates) _recipientMiscEffects.push (_contact.recipientReadyUpdates);
}
}

public class ContactEntity
{
private var _recipientReadyUpdates: Vector.<CUEntity> = new Vector.<CUEntity>; // Готовые пакеты обновлений для реципиента

public function get recipientReadyUpdates() : Vector.<CUEntity> {return _recipientReadyUpdates}
}

Вроде всё просто как грабли, но в рантайме получаю исключение:

[Fault] exception, information=TypeError: Error #1034: Type Coercion failed: cannot convert __AS3__.vec::Vector.<data.characterUpdates::CUEntity>@7bc5281 to data.characterUpdates.CUEntity.

Что за фигня? Никогда такого не встречал. Тип точно один и тот же. Единственное, что в векторе <CUEntity> могут встречаться экземпляры его наследников, но это никогда не мешало... В общем, я в полном тупике и не понимаю, где проверять.

Спасибо.

Wolsh
19.09.2018, 07:54
Ну, у тебя вектор для элементов CUEntity, а ты суешь в него не CUEntity, а вектора.
_recipientMiscEffects.push (_contact.recipientReadyUpdates);

Текст ошибки говорит сам за себя: "Не могу сконвертировать Вектор.<CUEntity> в CUEntity".

Appleman
19.09.2018, 09:52
wolsh, привет, рад видеть :)

Спасибо, и правда. Как-то я неадекватно хелп понял. Специально про push почитал, что принимает он один или несколько элементов для добавления в массив. Но вот почему я решил, что эти "несколько" можно упаковать в вектор, сам не понимаю :)

По итогу выкрутился топорно: пробежал через while и поэлементно перенёс, хотя это конечно порно.

ZergMaster
19.09.2018, 16:51
а может быть проще будет сделать слияние?

if (_contact.recipientReadyUpdates) _recipientMiscEffects.concat(_contact.recipientReadyUpdates);

СлаваRa
19.09.2018, 19:53
@ZergMaster ну создал ты новую коллекцию из двух, которую потом не используешь, и зачем?

ZergMaster
20.09.2018, 19:25
СлаваRa почему не используешь? Я так понял, человеку нужно было сложить два вектора, для чего он пытался использовать push, но когда не вышло - делает push перебором через while. Вот я и предложил использовать concat

СлаваRa
20.09.2018, 20:20
concat - не модифицирует исходный вектор, в отличие от splice

ZergMaster
24.09.2018, 12:47
а, ну да.

var _tempRecipientMiscEffects: Vector.<CUEntity> = _recipientMiscEffects;
_recipientMiscEffects = _contact.recipientReadyUpdates ? _tempRecipientMiscEffects.concat(_contact.recipientReadyUpdates) : _tempRecipientMiscEffects;