Java: доступ к элементам объекта в многомерном Arrylist - PullRequest
0 голосов
/ 07 мая 2020

Я сохранил объекты с 3 атрибутами в 2-мерном ArrayList, но я не знаю, как получить к ним доступ / прочитать их из ArrayList.

Мой код на данный момент: Создание класса объекта:

import java.util.ArrayList;

public class TwoDimMatrix {

    private class MyObject{
        private String attr1;
        private String attr2;
        private String attr3;
        public String getAttr1() {
            return attr1;
        }
        public void setAttr1(String attr1) {
            this.attr1 = attr1;
        }
        public String getAttr2() {
            return attr2;
        }
        public void setAttr2(String attr2) {
            this.attr2 = attr2;
        }
        public String getAttr3() {
            return attr3;
        }
        public void setAttr3(String attr3) {
            this.attr3 = attr3;
        }
    }
    public static void main(String[] args)
    {
        TwoDimMatrix matrix = new TwoDimMatrix ();
        Integer lines = 5;
        Integer rows = 5;

        ArrayList<ArrayList<Object>> twodimmat = new ArrayList<>();
        for(int i=0; i<lines ; i++)
        {
            twodimmat.add(new ArrayList<Object>());
            for(int j=0; j < rows ; j++)
            {
                MyObject obj = matrix.new MyObject();
                obj.setAttr1("36");
                obj.setAttr2("24m");
                obj.setAttr3("2H");
                twodimmat.get(i).add(obj);
            }
        }
        System.out.println(twodimmat.get(0).get(1));
    }

}

Я получаю только «MyObject», но как я могу прочитать значения, хранящиеся в атрибутах, например Attr1 или Attr2? При попытке доступа с помощью метода получения я получаю ошибку компилятора

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method getAttr1() is undefined for the type Object

Я могу назначить объекты в ArrayList экземпляру объекта типа, но не экземпляру MyObject, поэтому у меня нет доступа к метод получения MyObject. Мне кажется, что я могу сохранить MyObject в типе ArrayList только как Object, что означает потерю всех методов MyObject. Значения все еще там (см. Прикрепленный снимок экрана), но как их читать?

Как получить доступ к атрибуту 'attr1' элемента 'itemObj'?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Самый простой 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>>

0 голосов
/ 07 мая 2020

Если у вас есть MyObject, просто вызовите его методы

System.out.println(twodimmat.get(0).get(1).getAttr1());
System.out.println(twodimmat.get(0).get(1).getAttr2());

Или

MyObject item = twodimmat.get(0).get(1);
System.out.println(item .getAttr1());
System.out.println(item .getAttr2());
...