2013-11-28 2 views
1

Я хочу создать массив, длина которого исправлена ​​, но элементы ссылаются на объекты Iterable. Точно так же, как создание массива с элементами указателя в C, где указатели могут указывать на списки любой длины.Как создать массив с элементами Iterable в Java?

Я попытался это:

// declaration 
private Iterable<String>[] a; 
... 
// in construtor, n is known length. 
a = (Iterable<String>[]) new Object[n]; 

компилятор дает мне предупреждение. И когда я выполняю программу. исключается нижеследующее исключение.

Exception in thread "main" java.lang.ClassCastException: 
[Ljava.lang.Object; cannot be cast to [Ljava.lang.Iterable; 

Я искал в Интернете. Но все результаты - динамический массив, но не массив фиксированной длины с динамическими элементами. Большое спасибо, если вы можете помочь!

UPDATE

Попробую поставить его проще. Я хочу как массив ссылок, и ссылка может указывать на некоторый объект Iterable.

+0

Вы прочитали, что он говорит? Вы не можете передать объект в Iterable. – hichris123

+3

Почему вы не используете ArrayList? Это требует меньших усилий, но более эффективно. –

+0

, если вы хотите гарантировать, что размер всегда постоянный и по-прежнему использует итерируемый, вы можете сначала создать нормальный массив и преобразовать его в список, чтобы использовать iterable над ним (e.g Массивы (a) .asList), надеясь, что вы знаете, что вы делаете – bjhaid

ответ

1

Я предполагаю, что вы действительно хотите массив, элементами которого являются Iterable<String>, так что я не скажу вам, чтобы использовать другую структуру данных. (Хотя это может быть хорошей идеей.)

Вы бегаете прямо в ужасное несоответствие в Java между массивами и дженериками.

Как вы обнаружили, Object[] не совместим с Iterable<String>[]. Так как первая попытка вы могли бы попытаться создать массив Iterable:

Iterable<String>[] a = new Iterable[n]; 

Это даст вам «rawtypes» предупреждение. Затем вы могли бы попытаться создать общий массив так:

Iterable<String>[] a = new Iterable<String>[n]; // ERROR 

, но это дает ошибку компилятора, «создание общего массива.» См. this answer по этой причине. Вкратце, причина в том, что дженерики обычно стираются и массивы массируются. Единственный овеществлённый универсальный типом является неограниченной подстановочными <?>, так что вы должны создать массив этого типа и бросьте:

Iterable<String>[] a = (Iterable<String>[])new Iterable<?>[n]; 

Теперь это дает непроверенное предупреждение. Это неизбежно, так что вы должны подавить его:

@SuppressWarnings("unchecked") 
Iterable<String>[] a = (Iterable<String>[])new Iterable<?>[n]; 

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

+0

Да, это ** wildcard ** работает! – leowang

0
I think you need to use something like this:- 

ArrayList<Iterable<String>> temp = new ArrayList<Iterable<String>>(); 
     Iterable<String> ob1=new Iterable<String>(){ 

      @Override 
      public Iterator<String> iterator() { 
       // TODO Auto-generated method stub 
       return new ArrayList<String>().iterator(); 
      } 

     }; 
     temp.add(ob1); 
+0

Да, я пробовал это, но, инициализируя его счетчиком 4 и пытаясь добавить объект Iterable, такой как очередь в индекс 3, генерируется исключение. – leowang

+0

ArrayList динамически растет, какое исключение выбрасывается? – Kishore

+0

Как вы говорите, он просто динамически растет. Исключением является «IndexOutOfBounds» с подсказкой о том, что «Размер равен 0, индекс равен 3». Кажется, что даже если я инициализирую его с 4, я не могу сначала добавить индекс 3, а это значит, что я не могу получить к нему доступ точно так же, как массив. – leowang

0

Проверьте приведенный ниже код. Вы не должны создать массив объектов, а итератор массив

@SuppressWarnings("unchecked") 
    public static void main(String[] args) { 
     Iterable<String>[] iterableArr;//array definition 
     //Java doesn't allow creation of generic type array (e.g. new Iterable<String>[]), 
     //so you can create a raw type array (e.g. new Iterable[2]). It generates compiler warning, which can be supressed. 
     iterableArr = new Iterable[2];//array initialization 

     List<String> list1 = new ArrayList<String>(); //Creating and adding list1 to iterableArr 
     list1.add("1"); 
     list1.add("2"); 
     list1.add("3"); 
     iterableArr[0] = list1; 

     List<String> list2 = new ArrayList<String>(); //Creating and adding list2 to iterableArr 
     list2.add("A"); 
     list2.add("B"); 
     list2.add("C"); 
     iterableArr[1] = list2; 

     //printing the data 
     for (Iterable<String> iterable : iterableArr) { 
      for (Iterator<String> iterator = iterable.iterator(); iterator.hasNext();) { 
       String string = (String) iterator.next(); 
       System.out.print(string+" "); 
      } 
      System.out.println(""); 
     } 
    } 

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

  • Нет связанных вопросов^_^