【问题标题】:Java creating instance of ArrayList from other classJava从其他类创建ArrayList的实例
【发布时间】:2019-01-31 19:35:33
【问题描述】:

情况如下:

头等舱:

class Something {
    List<Object> names;
    public Something(){
       this.names = new ArrayList<Object>();    
    }
}

第二节课我试过做类似的事情,但它不起作用:

class Main {
    public static void main(String[] args){
        Something names = new Something();
        ...
        for(Object name: names){
           ...
        }
    }
}

它说我不能遍历“名称”,为什么?我做错了什么?

【问题讨论】:

  • Something 没有实现Iterable&lt;T&gt;,所以你不能直接迭代它;您必须遍历其 names 字段:for(Object name : names.names)
  • Getter/setter ...更好的是,让您的 IDE 为您创建它们,这样您就可以避免腕管。

标签: java object arraylist


【解决方案1】:

尽量不要调用您的Something 实例namesnamesSomething 类实例的成员。您正在尝试迭代您的 Something 类,而不是其中的 names 数组。

class Main {
    public static void main(String[] args){
        Something something = new Something();
        ...
        for(Object name: something.names){
           do smth;
        }
    }
}

【讨论】:

    【解决方案2】:

    您可能打算在您的Something迭代列表:

    public static void main(String[] args){
        Something something = new Something();
        // then assign something.names to something
        ...
        for (Object name: something.getNames()) {
            // do something
        }
    }
    

    因此,您可能希望在您的类中为 names 列表公开一个 getter 和 setter:

    class Something {
        List<Object> names;
    
        public Something() {
            this.names = new ArrayList<Object>();    
        }
    
        public List<Object> getNames() {
            return names;
        }
    
        public void setNames(List<Object> names) {
            this.names = names;
        }
    }
    

    【讨论】:

      【解决方案3】:

      您的Something 类不是List。但它包含一个List

      class Something {
          List<Object> names;
      
          public List<Object> getNames(){
             this.names = new ArrayList<Object>();    
          }
      
          public void setNames( List<Object> list ){
             this.names = list;    
          }
      }
      
      class Main {
          public static void main(String[] args){
              Something somethingObj= new Something();
             List<Object> newNames = new ArrayList<>();
             newNames.add( new Object() );
             somethingObj.setNames( newNames ); 
      
              for(Object name: somethingObj.getNames()){
                 ...
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        其他答案给出了很好的解决方案。但是,如果您确实只想在增强的 for 循环中使用 something 怎么办?

        你必须让类实现Iterable:

        class Something implements Iterable<Object> {
        

        并实现iterator()方法:

        @Override public Iterator<Object> iterator() {
          return names.iterator(); // for example.
        }
        

        现在你可以写了:

        for (Object object : something) { ... }
        

        编译器可以接受。

        但你应该只在Somethingis-a Iterable of Objects 的情况下这样做,即它本质上是对应该迭代的东西进行建模(例如,它“像一个列表”)。否则,如果它只是有一个对象的可迭代对象,请坚持使用其他建议的解决方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-03
          • 2022-08-02
          • 1970-01-01
          • 1970-01-01
          • 2011-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多