Java: как передать двумерный ArrayList методу/конструктору

Я пытаюсь передать 2d ArrayList конструктору. Заголовок конструктора такой:

public Table( ArrayList<ArrayList<?>> table )
{

После этого я пытаюсь реализовать следующий код в main:

ArrayList<ArrayList<Object>> 2dList = new ArrayList<ArrayList<Object>>(2); 

Table Data1 = new Table( 2dList );

Однако, когда я пытаюсь использовать такой код, я получаю следующую ошибку:

no suitable contructor found for Table(java.util.ArrayList<java.util.ArrayList<java.lang.Object>>)
    constructor Table.Table(java.util.ArrayList<java.util.ArrayList<?>>) is not applicable
    (argument mismatch; java.util.ArrayList<java.util.ArrayList<java.lang.Object>> cannot be converted to java.util.ArrayList<java.util.ArrayList<?>>)

Какой будет правильная реализация? Простите меня, если я неправильно понял какую-либо основную идею или сделал глупую ошибку.

Благодарю вас.


person Rezwan Azfar Haleem    schedule 16.12.2014    source источник
comment
Заменить ? на Object?   -  person BitNinja    schedule 17.12.2014
comment
Нет, ты не делаешь глупой ошибки. Дженерики совершенно сбивают с толку. Я столкнулся с этим на днях (см. stackoverflow.com/q/27465348/3973077). Вы можете заставить это работать, написав Table(ArrayList<? extends ArrayList<?>> table), но простые смертные не должны понимать почему.   -  person Paul Boddington    schedule 17.12.2014


Ответы (2)


ArrayList<ArrayList<Object>> не является ArrayList<ArrayList<?>>, хотя ArrayList<Object> является ArrayList<?>, по той же причине, по которой List<Dog> не является List<Animal>, даже если Dog является Animal.

Чтобы передать ArrayList<ArrayList<Object>>, включите в подпись еще один подстановочный знак:

public Table( ArrayList<? extends ArrayList<?>> table )
person rgettman    schedule 16.12.2014
comment
Я вернулся и просмотрел реализацию подстановочных знаков и концепцию наследования, и теперь это имеет для меня полный смысл. Благодарю вас. - person Rezwan Azfar Haleem; 17.12.2014

Имена переменных не могут начинаться с цифр! 2dList должно быть list2D или что-то в этом роде

Также объявите свой конструктор так

public Table(ArrayList<? extends ArrayList<?>> list2D) {

}

Или вот так

public <E> Table(ArrayList<ArrayList<E>> list2D) {

}
person Logan Murphy    schedule 16.12.2014