ArrayStoreException пры спробе ўсталяваць элемент масіва ў суперкласса аб'екта

class A {}
class B extends A {}

Прывітанне, Я вучуся Java, і я спрабую зразумець, чаму гэта працуе:

A[] tab = new A[10];
tab[0] = new B();

а не так:

A[] tab = new B[10];
tab[0] = new A();

гэты радок А [] = ўкладка новы У [10]; азначае, што кампілятар рэзэрвуе 10 месцаў для B ў памяці. <�Код> ўкладка [0] = новы А() ўсталёўвае ўкладка [0] роўны новы А аб'ект, які менш (?), Чым < код> B ( Б пашырае A ).

Чаму там ArrayStoreException: А памылка? Як гэта працуе?

0
Падумайце пра гэта. Калі Сабака распаўсюджваецца жывёліну то сабака гэта жывёла, але не ўсе жывёлы сабака.
дададзена аўтар Maroun, крыніца

7 адказы

Вы можаце захоўваць падкласы аб'екта, унутры гэтага аб'екта. г.зн. У можа быць захаваны ў A , але А з'яўляецца суперкласса тыпу Б . У прынцыпе, любы клас ніжэй класа X у ланцужку спадчыну можа быць аднесены да тыпу X , але любы клас вышэй класа X у ланцужку спадчыну НЕ можа быць аднесены да тыпу X .

<�Б> Ваш прыклад

A[] tab = new A[10];//Perfectly fine. Equal objects.
tab[0] = new B();//B is a subclass of A, so this is allowed.

A[] tab = new B[10];//Same principle as above, B is a subclass of A
tab[0] = new A();//A is a SUPERCLASS of B, so it can not be referred to as A

Карацей кажучы, X можа быць перададзены толькі як Y , калі X з'яўляецца падклас Y . (Або падклас падкласа. Гэта рэкурсіўнае вызначэнне).

<�Б> Давайце выкарыстоўваць некаторыя ангельскія тэрміны

Замест А і B , давайце Кропка і кнігі .

public class Item {}

public class Book extends Item {}

Цяпер, мае сэнс сказаць:

Item b = new Book();//All Books are items.

Гэта не мае сэнсу казаць:

Book b = new Item();//All items are definitely not books.
4
дададзена

"Мой масіў жывёл будзе ўтрымліваць толькі матылі ( A ўкладцы [] = новы B [10]; ). Дадаць новае жывёла ў масіве ( ўкладка [0] = новы A (); ) ".

Як быць упэўненым, устаўленыя жывёламі з'яўляюцца матыльком?

1
дададзена

Згодна Documentation

<�Р> Кінуты, каб паказаць, што спроба была зробленая <�моцны>, каб захаваць няправільны   тып аб'екта ў масіў аб'ектаў </моцных>. Напрыклад, наступнае   код генеруе ArrayStoreException: </р>
Object x[] = new String[3]; 
x[0] = new Integer(0);
1
дададзена

Гэта зводзіцца да найбольш істотнага ўласцівасці сістэмы іерархічнага тыпу, якая з'яўляецца <�ет> Ліскі прынцып замяшчэння : усюды, дзе асобнік дапускаецца, асобнік любых з яго падтыпаў таксама дапускаецца. Масівы не зьяўляюцца прыватным выпадкам.

1
дададзена

Таму што, калі B пашырае A, B мае ўсе характарыстыкі A (атрыбуты, метады і г.д.), плюс яго ўласная.

Тады кожны У таксама А, у той час як А (што б недахоп характарыстыкі B) не з'яўляецца Б.

1
дададзена

Прымаючы пад увагу:

class A { }

class B extends A { }

Мы маем:

A [] a = new A [10];//can store A or B objects

A [] b = new B [10];//can only store B objects
1
дададзена

Эмпірычнае правіла ў Java з'яўляецца суперкласса спасылачныя зменнай можа паказваць на суб аб'ект класа, а не наадварот, калі вы думаеце пра гэта, гэта мае сэнс, што бацькоўскі клас можа паказваць на аб'ект класа дзіцяці. спіс List = новы ArrayList ()

1
дададзена