Спецификация языка определяет подтипы между типами массивов в Sec 4.10.3 :
Следующие правила определяют прямое отношение супертипа между типами массивов:
Если S
и T
оба являются ссылочными типами, то S[] >1 T[] iff S >1 T
.
Object >1 Object[]
Cloneable >1 Object[]
java.io.Serializable >1 Object[]
Если P
является примитивным типом, то:
Последние маркеры («Если P
является примитивным типом ...») показывают, что язык не определяет никакой связи между массивами различных примитивных типов.Единственные допустимые назначения:
byte[] bs = new byte[10];
byte[] bs2 = bs;
Object obj = bs;
Cloneable cl = bs;
Serializable ser = bs;
Это не дает ответа относительно почему это так;Вы должны спросить языковых дизайнеров.Однако простые примеры, подобные показанным Eran , демонстрируют, почему было бы небезопасно делать так, как предлагает OP.
Следует отметить, что первая строка - которая разрешает присваивание, например
Object[] obj = new String[10];
obj[0] = new Object(); // ArrayStoreException!
- ошибка проектирования: ковариантность массивов делает их небезопасными.Это одна из причин, по которой я настоятельно предпочитаю обобщенные элементы массивам, поскольку обобщенные элементы инвариантны и поэтому предотвращают такие назначения.