2013-06-23 6 views
0

В обработке у меня есть ArrayList объектов, построенных из пользовательского класса. Когда я использую функцию .get() для возврата одного из объектов, кажется, что он возвращает объект в порядке, но я не могу получить доступ к каким-либо переменным или методам объекта. Я получаю сообщение об ошибке «[variable] не может быть разрешен или не является полем». Это ошибка, или я делаю что-то неправильно?Возвращает ли ArrayList.get() то же самое, что и массив []?

Вот образец. Обратите внимание на значения, возвращаемые функцией setup().

// regular array 
Thing[] thinglist1 = new Thing[1]; 

// ArrayList array 
ArrayList thinglist2 = new ArrayList<Thing>(1); 

// instantiate the class 
Thing thing = new Thing(12345); 

// class definition 
class Thing { 
    int var; 

    Thing(int i){ 
    var = i; 
    thinglist1[0] = this; 
    thinglist2.add(this); 
    }; 
}; 

// run it! 
void setup(){ 
    println(thinglist1[0] == thinglist2.get(0)); 
    // true 

    println(thinglist1[0].var); 
    // 12345 

    println(thinglist2.get(0).var); 
    // ERROR: "var cannot be resolved or is not a field" 
}; 
+0

родственный: [? Что такое сырье типа и почему мы не должны использовать его] (http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why -shouldnt-we-use-it) –

ответ

9

Вы как-то испортили свои дженерики.

Изменить

ArrayList thinglist2 = new ArrayList<Thing>(1); 

к:

ArrayList<Thing> thinglist2 = new ArrayList<Thing>(1); 

Поскольку вы не указали тип, что вы на самом деле меня было:

ArrayList<? extends Object> thinglist2 = new ArrayList<Thing>(1); 

Итак, когда вы извлечь элемент из он использовал get, он был напечатан как Object, а не ваш Thing

Редактировать Добавить: Причина этого - наследие; когда были введены дженерики, были установлены условия для обратной совместимости. К сожалению, это создает такие ситуации, которые запутывают кого-то нового для Java.

Вероятно, вы ожидаете предупреждения или ошибки компилятора, но Java молча изменяет этот нестандартный тип ArrayList на «Arraylist, который содержит что-то, что расширяет Object» ... что-то (кроме примитива), потому что все объекты неявно расширяются Object

+0

awesome :) отличный ответ –

+0

Я бы просто сказал: «что у вас на самом деле было:« ArrayList '...» - так как он более точный и добавление подстановочных знаков в микс может сбивать с толку. –

+0

@PaulBellora - уже исправлено, что в редактировании - обновить;) Я думаю, что то, что на самом деле происходит, является более точным, а затем объясняет почему. –

-2

В последней строке вы должны отбрасывать возвращаемое значение из функции get в массив объекта.

System.out.println(((Thing[])thinglist2.get(0))[0].var);