Размеры в массиве всегда от типа int.Подумайте об этом!
int a = 4;
int b = 5;
Shoe shoe = new Shoe (Color.RED, 42, "Leather");
Hat hat = new Hat (17, Color.Black);
Foo foo = foos[a][b];
Zilch pop = bars[shoe][hat]; // no go
Если у вас есть многомерный массив Foos, первое измерение - это Foo, второе - массив Foos, третье - массив массива Foo.Единственный тип переменной - тот, что внизу.
Редактировать после обновления вопроса:
Массивы не называются статическими или примитивными.Их размер фиксируется при инициализации, и они имеют общее с примитивами в том, что они являются buildin, что в некоторых случаях представляет особую опасность.Они - в отличие от так называемых примитивных типов, которые не являются такими примитивными (у них есть, например, операторы, исключительно для своих собственных, например * / -
), но в то же время они являются объектами, но не объявлены в библиотеке.
Назовите их build in-types
.
Используя трюк Беш Гурунга:
Object[] arr = {new Integer[]{}, new String[]{}, new Double[]{}};
требует проблем, и он не состоит из разных типов данных для измерения.Давайте начнем с измерений:
// One-dimensional object:
JPanel [] panels = new JPanel [3];
// Two-dimensional object:
JPanel [][] panels = new JPanel [3][10];
У вас есть JPanels на нижнем уровне и массив JPanel на следующем измерении.Вы можете добавить больше измерения, и всегда получите дополнительный (Array of ...) обернутый вокруг.
Вы не можете смешивать различные типы данных в массиве, такие как int и char, или JPanel и JFrame, или int и JButton.Только если вы абстрагируетесь от разницы и используете JComponent для JPanel и JFrame в качестве общего родителя, но это не будет работать для встроенных типов int, char, boolean и т. Д., Поскольку они не являются объектами.
Но разве вы не можете использовать автобокс и использовать Integer вместо int, Character вместо char, а затем использовать Object в качестве общего родительского класса?Да, вы могли бы, но тогда вы больше не используете примитивы и просите неприятностей.
Дэн говорит о другом - об использовании разных типов для индексации в многомерном массиве:
byte b = 120;
short s = 1000;
String o [][] = new String[b][s];
b = 7;
s = 9;
o[b][s] = "foobar";
String foo = o[b][s];
Нет проблем с использованием байтов или шортов, но вы не можете ограничитьразмер массива, объявив его как байтовый или короткий.В большинстве случаев границы встроенного целочисленного типа не будут соответствовать типу данных (например, 365 дней в году), особенно, поскольку все типы могут становиться отрицательными, поэтому проверка границ необходима, хотя и не может быть ограничена для компиляциивремя.
Но теперь возникли проблемы:
Мы могли бы объявить массив двумерным с самого начала:
Object[][] ar2 = {
new Integer [] {4, 5, 6},
new String [] {"me", "and", "you"},
new Character [] {'x', 'y', 'z'}};
Это прекрасно работает и делает внутренние массивы доступными сразу, без приведения,Но только для компилятора известно, что элементы являются массивами объектов - базовый тип абстрагируется, и поэтому мы можем написать:
ar2[1][1] = 17; // expected: String
ar2[2][0] = "double you"; // expected: Char
Это скомпилируется без ошибок, но вы стреляете в себяпешком и получите исключение Runtime бесплатно.
Вот источник в целом:
public class ArrOfMixedArr
{
public static void main (String args[])
{
Object[] arr = {
new Integer [] {1, 2, 3},
new String [] {"you", "and", "me"},
new Character [] {'a', 'b', 'c'}};
show (arr);
byte b = 7;
short s = 9;
String o [][] = new String[200][1000];
o[b][s] = "foobar";
String foo = o[b][s];
Object[][] ar2 = {
new Integer [] {4, 5, 6},
new String [] {"me", "and", "you"},
new Character [] {'x', 'y', 'z'}};
show (ar2);
// exeptions:
ar2[1][1] = 17; // expected: String
ar2[2][0] = "double you"; // expected: Char
}
public static void show (Object[] arr)
{
for (Object o : arr)
{
if (o instanceof Object[])
show ((Object[]) o);
else
System.out.print (o.toString () + "\t");
}
System.out.println ();
}
}
Теперь, каково решение?Если ваши массивы базовых типов (int, byte, char, String, JPanel, ...) имеют одинаковую длину, то у вас есть что-то вроде скрытого объекта, строки базы данных.Вместо этого используйте класс:
class Shoe {
byte size;
String manufactor;
java.math.BigDecimal price;
java.awt.Color color;
}
Shoe [] shoes = new Shoe [7];
Если у вас нет разных типов одинакового размера, они могут быть не связаны и не должны помещаться в общий контейнер.