【问题标题】:Accessing specific object fields from an ArrayList从 ArrayList 访问特定对象字段
【发布时间】:2015-07-18 05:45:52
【问题描述】:

假设我们创建了一个ArrayList 类型的listOfObjects,其中包含Object 类型的对象:

 public static ArrayList listOfObjects = new ArrayList();

我们有一个Object 构造函数,它创建一个Object 有两个字段,名称和类型:

public Object(String name, int type) { /*some code*/ }

现在我们创建两个Objects,然后将它们添加到listOfObjects

public static Object object1 = new Object("object one", 1);
public static Object object2 = new Object("object two", 2);
listOfObjects.add(object1);
listOfObjects.add(object2);

假设object1object2被正确添加到listOfObjects,我们如何访问列表中对象的type字段?

我试过了

listOfObjects.get(1).type;

但这似乎不起作用。有没有办法做到这一点?

EDIT Object 是一个示例名称。

【问题讨论】:

  • nametype 字段是否在您的 Object 类中声明(这是一个 bad bad bad 名称)?如果不是应该是。
  • 是的,我们假设名称和类型已在 Object 类中声明。
  • 我认为这里的问题是你错过了default non parameterized constructor的防御,因为如果你有另一个应该定义它,看看我的回答。

标签: java object arraylist field


【解决方案1】:
  1. 定义一个名为Object 的类是一个非常糟糕的主意,因为已经有一个名为java.lang.Object 的类,并且由于它位于java.lang 包中,因此您的所有源都会隐式导入它。
  2. 您需要公开您的字段 - public int type;,如果您想以您发布的方式访问它。
  3. 将字段公开也不是一个好主意,因此请为它们公开 getter: public int getType() { return type; }

【讨论】:

    【解决方案2】:

    首先将你的类名改为Object,然后在这个类中声明两个字段nametype,你将在其中存储你在构造函数中传递的值,你的代码应该是这样的:

    public class TestObject {
    
        //The best approach is to declare your fields here as private
        private String name;
        private int type;
    
        //default non parameterized constructor
        public TestObject() {
            super();
        }
    
        public TestObject(String name, int type) {
             this.name = name;
             this.type = type;
        }
    
        //getters and setters of your fields to make them accessible in public
        public String getName(){
            return this.name;
        }
        public void setName(String name){
            this.name = name;
        }
    
        public int getType(){
            return this.type;
        }
        public void setType(int type){
            this.type = type;
        }
    

    要从您的列表中获取对象type,您的调用应该是这样的:

      //use getType() getter to get the type field value
      listOfObjects.get(1).getType();
    

    【讨论】:

      【解决方案3】:

      你的 Object 类应该是这样的,

      public class Object {  
          private String name;
          private int type;
      
          public Object(String name, int type) {
              this.name = name;
              this.type = type;
          }
      
          public int getType(){
             return type;
          }
      }
      

      然后你可以通过listOfObjects.get(1).getType();联系到

      【讨论】:

        【解决方案4】:

        您需要使用Object.getClass()

        【讨论】:

          【解决方案5】:

          首先,使用除Object 之外的其他名称作为类名。虽然您可以使用它,但它只会给讨论增加混乱。 (提示:这就是使用 foo 和 bar 等元句法变量的原因。

          其次,你说“它不起作用”。以什么方式?程序是否编译?它运行吗?你有错误信息吗?

          最后,阅读 Java 泛型,他们现在已经 16 岁了。如果您是一名学生,并且您学习了没有泛型的集合,请教育您的教授(否则您会被敲诈)。

          最后,重写这一行:

          public static ArrayList<Object> listOfObjects = new ArrayList<>();

          【讨论】:

            【解决方案6】:

            您的构造函数public Object(String name, int type) 应该将参数分配给公共对象变量。示例:

            public class MyObject {
                public String name;
                public int type;
            
                public MyObject(String name, int type) {
                    this.name = name;
                    this.type = type;
                }
            }
            

            那么调用listOfObjects.get(1).type;就可以了。

            编辑:将类从Object重命名为MyObject

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-01-12
              • 2012-06-23
              相关资源
              最近更新 更多