Самый простой c класс в java - это объект.
Runnable a = ()->System.out.println("a");
a
- это объект, который реализует runnable.
Object b = a;
b
- это а, ничего не изменилось. Технически b
запускает метод, но мы написали его так, чтобы не видеть метод.
a.run(); //works
b.run(); //fails at compile time.
((Runnable)b).run(); //works.
В вашем случае у вас есть MyObject,
MyObject obj = ...;
Object obj2 = obj;
Теперь obj2
на самом деле MyObject
, но мы скрыли этот факт. Поэтому, если вы хотите использовать эти методы, вам необходимо преобразовать или использовать исходную ссылку.
((MyObject)obj2).getAttr1();
Если мы не приведем преобразование, компилятор выдаст нам ошибку, потому что не все объекты имеют метод .getAttr1.
Вот для чего предназначены Generics.
List<MyObject> objects = new ArrayList<>();
//add a couple objects.
MyObject obj = objects.get(0);
Теперь доступны все методы MyObject.
List<Object> broken = new ArrayList<>();
broken.add(new MyObject());
broken.add(new Object());
Возможно, вы заметили проблему.
Object one = broken.get(0);
Object two = broken.get(1);
Мы знаем, что Object one
является MyObject, но two
- нет. Так что компилятор по праву не позволяет нам позвонить. one.getAttr1()
((MyObject)one).getAttr1(); //works
((MyObject)two).getAttr1(); //fails at runtime.
Мораль рассказа. Используйте List<List<MyObject>>
вместо List<List<Object>>