2015-07-05 4 views
1

Я хотел бы знать, есть ли способ сделать массив из SuperType и массив из SubType. Как так:Обманывание JVM в литейные массивы

SubType[] subArray = (SubType[])someSuperTypeArray; 

Я знаю, что во время выполнения этого бросает ClassCastException. Способ преобразования массива состоит в том, чтобы скопировать его в другой массив. В моем случае копирование это не вариант.

Могу ли я обмануть JVM в убеждении, что актер действителен и обходит проверки типа класса? Создание ссылки на массив из SuperType, через который он рассматривается как некоторый массив SubType. (Возможно, перед опасностью необъяснимых ошибок)

+0

Что означает «Мне нужно преобразовать массив, чтобы скопировать его в другой массив» означает? –

+0

К сожалению, это была опечатка на моем конце. – wintergrascph

+0

Нет трюков - пройдите длинный путь. Создайте новый массив типа, который вы хотите, перейдете к суперклассу и произнесите каждую ссылку, как вы ее назначаете. – duffymo

ответ

3

если вы определите массив как

SuperType[] array = {element1, element2}; 
SubType[] array2 = (SubType[]) array; 

он не будет работать, однако вы можете сделать это:

SuperType[] array = new SubType[]{element1, element2}; 
SubType[] array2 = (SubType[]) array; 

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

+0

Возможно, мне не хватало точки, но почему вы хотите что-то, что уже является типом «новой» переменной.Вы в основном создаете указатель в моем сознании – engineercoding

+0

@engineercoding Чтобы получить доступ к членам, которых нет в 'SuperType'? – CKing

+0

@engineercoding хорошо, если у вас есть метод, который принимает параметр SubType [] в качестве параметра, например. void method (SubType [] array) {}, и вы хотите добавить свой SuperType [], его нужно создать таким образом. –

1

Есть только два возможных экземпляра массива, на которые может ссылаться someSuperTypeArray.

  1. SuperType someSuperTypeArray = new SuperType[10];: Вы можете добавить SuperType объекты или SubType объекты в массив
  2. SuperType someSuperTypeArray = new SubType[10];: Вы можете добавлять только SubType объекты в этом массиве. (Технически, вы можете добавить SuperType объекты в этом массиве во время компиляции, но это приведет к ArrayStoreException во время выполнения)

Давайте предположим на секунду, что в случае 1, вам удастся обмануть JVM в позволяя вам для перевода ссылки someSuperTypeArray на ссылку SubType[]. Что делать, если someSuperTypeArray имеет элемент типа SuperType? Вы действительно не можете ожидать, что приведение неявно отменит все элементы SuperType.

В случае 2 есть ли какая-либо точка использования ссылки SuperType[] на экземпляр массива SubType[], если все, что вы хотите сделать, это ссылка на ссылку SubType[]. Просто используйте ссылку SubType[].

+0

Ну в первом случае кажется, что «Поздравляю! Мне удалось выявить уязвимость безопасности в некоторых JVM». Я не знал о втором случае, спасибо за то, что вы указали это. Как-то я не думал, что на самом деле это испробовал. – wintergrascph

Смежные вопросы