2016-10-19 2 views
0

С самого начала я программировал на C++, но теперь работал над проектом, связанным с администрированием сети на Java. Здесь a[i].addresses возвращает NetworkInterfaceAddress[] (т. Е. Массив). Но когда я пытаюсь скопировать, как это, он дает ошибку.Почему я не могу хранить массивы внутри другого массива?

NetworkInterface[] a; 
a=JpcapCaptor.getDeviceList(); 
NetworkInterfaceAddress[] b=new NetworkInterfaceAddress[a.length]; 
int i=-1; 
while(++i<a.length) 
b[i]=a[i].addresses; 

Это дает ошибку:

incompatible types: NetworkInterfaceAddress[] cannot be converted to NetworkInterfaceAddress. 
+3

Я думаю, что [i] .addresses; возвращает массив NetworkInterfaceAddress. вы можете проверить? –

+0

Да, это происходит по ссылке: http://jpcap.gitspot.com/javadoc/jpcap/NetworkInterface.html#addresses. И я хочу, чтобы все эти адреса были сохранены в b. –

+0

Хорошо, тогда вам нужно скопировать его в массив для этого 'NetworkInterfaceAddress [] b = new NetworkInterfaceAddress [a.length];' вы можете иметь один экземпляр NetworkInterfaceAddress в каждом столбце. Поэтому вы не можете его хранить. –

ответ

0

Массив b является NetworkInterfaceAddress массив, а это означает, что он может хранить objects типа NetworkInterfaceAddress. Однако, как вы сказали, a[i].addresses возвращает массив из NetworkInterfaceAddress Итак, b должна быть способна хранить массивы типа NetworkInterfaceAddress вместо объектов типа NetworkInterfaceAddress. Для этого b должно быть массивом массивов или неровным массивом. Определение изменить Б к

NetworkInterfaceAddress[][] b = new NetworkInterfaceAddress[a.length][]; 

Затем, при добавлении a[i].addresses в массиве, присвоить длину текущего массива внутри Ь, который должен держать a[i].addresses, чтобы a[i].length.

while(++i<a.length){ 
    b[i] = new NetworkInterfaceAddress[a[i].addresses.length]; 
    b[i] = a[i].addresses; //b[i] is an array itself 
} 
+2

Вы дважды назначаете 'b [i]', поэтому первое значение немедленно перезаписывается. Решите, хотите ли вы скопировать содержимое массива (чего нет в текущем коде), или достаточно скопировать ссылку на массив (для которой достаточно второго присвоения). –

+0

@ OleV.V. Да, на самом деле, я хочу сделать то, что делает второе задание. Я не понимал, что он может сделать это в одиночку, что я пытаюсь сделать; Я привык к предотвращению 'NullPointerException' для массивов объектов, о которых мне не нужно беспокоиться о зубчатых массивах. Вот почему я сначала инициализировал 'b [i]' – progyammer

+0

Спасибо за разъяснение. Вы, IDE, должны сказать вам, что первое назначенное значение никогда не используется (или вы не настроили его предупреждения правильно :-) –

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