从 ArrayList 访问特定对象字段

Posted

技术标签:

【中文标题】从 ArrayList 访问特定对象字段【英文标题】:Accessing specific object fields from an 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的防御,因为如果你有另一个应该定义它,看看我的回答。 【参考方案1】:
    定义一个名为Object 的类是一个非常糟糕的主意,因为已经有一个名为java.lang.Object 的类,并且由于它位于java.lang 包中,因此您的所有源都会隐式导入它。 您需要公开您的字段 - public int type;,如果您想以您发布的方式访问它。 将字段公开也不是一个好主意,因此请为它们公开 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

【讨论】:

以上是关于从 ArrayList 访问特定对象字段的主要内容,如果未能解决你的问题,请参考以下文章

如何访问特定的对象字段?

如何从java中的抽象类arraylist打印特定的对象类型

更新 ArrayList 适配器

Java中 ArrayArrays与ArrayList

使用 Swift (Firestore) 访问特定文档字段

C#中 [], List, Array, ArrayList 區別