for-each不适用于表达式类型

3
我遇到了这个错误,但我不理解为什么会出现。我是Java的初学者,但我知道for-each循环只用于可迭代对象。在这里,我想将类SetOfObjects创建为一个ArrayList<SubObject>。在toString方法中,循环没有问题,但在myFunction中,我遇到了错误。请问有人能告诉我我做错了什么吗?
public class SetOfObjects {
    private ArrayList<SubObject> setOfObjects;

    public SetOfObjects(ArrayList<SubObjects> arr){
        this.setOfObjects = arr;
    }

    @Override
    public String toString() {
        String finalString = "";
        for (SubObject obj : setOfObjects) {
            finalString += obj.toString();
        }    
        return finalString;
    }

    public SetOfObjects myFunction(SetOfObjects aSet){
        for (SubObject obj : aSet) {    <----ERROR
            //do something
        }
    }

4
SetOfObjects 没有实现 Iterable<? extends SubObject> - Andy Turner
1
请注意,setOfObjects 不是一个 set(集合),而是一个列表。这很令人困惑。你可以将它称为 objects(或 listOfObjects),或者将其实际上变成一个 Set(集合)。 - Andy Turner
另外,当在循环内进行多次字符串连接时,请使用 StringBuilder。使用 += 运算符会在每次循环中创建一个新的字符串对象。而 StringBuilder 则会重复使用同一个对象直到整个循环结束。 - Gi0rgi0s
2个回答

5
SetOfObjects并没有实现Iterable<? extends SubObject>(也不是数组)。参见JLS 14.14.2

如果表达式类型不是可迭代的或者是一个数组类型(§10.1),那么就会出现编译时错误。

如果您需要遍历aSet.setOfObjects,您可以这样做:
for (SubObject obj : aSet.setOfObjects) {

或者让SetOfObjects实现Iterable<SubObject>:

class SetOfObjects implements Iterable<SubObject> {

  // ...

  @Override public Iterator<SubObject> iterator() {
    return setOfObjects.iterator();
  }

1
public SetOfObjects myFunction(**SetOfObjects aSet**){
    for (SubObject obj : aSet) {    <----ERROR
        //do something
    }
您正在尝试使用对象来迭代循环,而应该使用对象列表。它必须是:
public SetOfObjects myFunction(List<SetOfObjects> aSet){
    for (SubObject obj : aSet) {    
        //do iteration 
    }

我认为你的建议在编译时会失败。 - Mahendra Kapadne
1
请在您的 IDE 中尝试。因为我没有考虑并在此处编写。 - Tejas 07

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,