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