2013-05-10 21 views
1

поэтому у меня есть эти четыре класса/интерфейса:Добавление общего ArrayList к ArrayList

public class Box <S extends SomeClass> implements Comparable <Box<S>> {...} 
    public interface SomeClass <T extends Comparable<T>> {...} 
    public class ThisItem implements SomeClass {...} 
    public class OtherItem implements SomeClass {...} 

И я пытаюсь создать список Box, который содержит список экземпляров ThisItem. Я не уверен, почему это дает мне ошибку.

public ArrayList<ArrayList<Box>> variable = new ArrayList<ArrayList<Box>>(); 
    this.variable.add(new ArrayList<Box<ThisItem>>(5)); 
+2

Убедитесь, что включать * * точные сообщения об ошибках в вопросах. – user2246674

+1

Это только я или иногда люди просто берут дженерики слишком далеко? –

ответ

5

Box это общий класс, поэтому при использовании его как Box, это сырой тип, который отличается от Box<ThisItem>, который имеет параметр типа указан. Это похоже на ArrayList<Box>, где Box это параметр типа.

Изменить это:

public ArrayList<ArrayList<Box>> variable = new ArrayList<ArrayList<Box>>(); 

To:

public ArrayList<ArrayList<Box<ThisItem>>> variable = new ArrayList<ArrayList<Box<ThisItem>>>(); 
+0

Это избавляет от ошибки, однако мне нужно создать экземпляр массива ArrayList, а затем добавить в это конструктор конструктора для нового класса ThisItem или OtherItem ArrayList, чтобы я мог добавлять к ним элементы соответствующего типа. – TheGandhi

1

ThisItem является тип SomeClassсырье; это примерно то же самое, что и объявление implements SomeClass<Object>, поэтому компилятор не может проверить, что это целесообразно использовать таким образом.

Вместо объявим его как прописано:

public class ThisItem implements SomeClass<SomeComparableClass> {...} 
+0

Я не совсем уверен, что вы подразумеваете под . Не могли бы вы объяснить это, пожалуйста? – TheGandhi

+0

SomeClass определяется как «открытый интерфейс SomeClass >», что означает, что реализовать его - это «типизированный» интерфейс (а не тип * raw *), который вы должны указать тип для общего параметра, и этот тип ограниченный классом Comparable, поэтому SomethingComparable предназначен для этого типа.Я изменил его имя, затем - см. Править – Bohemian

0

Что об этом ..

public ArrayList<ArrayList<Box>> variable = new ArrayList<ArrayList<Box>>(); 
this.variable.add(new ArrayList<Box<ThisItem>>(5)); 

к ...

public ArrayList<ArrayList<Box>> variable = new ArrayList<ArrayList<Box>>(); 
ArrayList<Box<ThisItem>> tempInstance = new ArrayList<>(); 
tempInstance.add(new Box<ThisItem>()); //add new Boxes manually as you wish 
this.variable.add(tempInstance); 
+0

Получил ошибку: «Невозможно скрывать ArrayList в ArrayList >« – TheGandhi

1

Как вы думаете, будет ли это безопасно let variable магазин список как ArrayList<Box<ThisItem>>?

Если Java допустит это, тогда при получении этого списка от variable оно будет обведено ArrayList<Box>. Из-за этого возвращенного списка вы можете добавить какой-либо объект Box к этому списку, изначально ArrayList<Box<ThisItem>> предполагал хранить только объект Box<ThisItem>.

Чтобы избавиться от этой проблемы, вы должны объявить variable, как

public ArrayList<ArrayList<Box<ThisItem>>> variable 
= new ArrayList<ArrayList<Box<ThisItem>>>(); 
+0

Проблема в том, что я не знаю, должно ли поле должно быть типа ThisItem или OtherItem, пока я не получу конструктор, требующий арраистов-арраистов. Так будет ли способ создать переменную экземпляра в конструкторе w.o, определяя переменную вне нее? – TheGandhi

+0

@ TheGandhi Цель этой ошибки состоит в том, чтобы остановить вас от ситуации, описанной в моем ответе, но если вы абсолютно уверены, что не будете добавлять неправильный объект в неправильные списки, вы можете избавиться от этой ошибки, отбросив ваш новый список на необработанный тип, например 'variable.add ((ArrayList) new ArrayList > (5));'. Но этот способ кодирования опасен для безопасности типов, поэтому не используйте его, если у вас действительно нет другого варианта (в большинстве случаев люди могут перепроектировать свои проекты, чтобы избежать подобных ситуаций). – Pshemo

0

Это должно работать:

public ArrayList<ArrayList<? extends Box>> variable = new ArrayList<ArrayList<? extends Box>>(); 
Смежные вопросы