0

Basically, I want to have

public ImmutableList<? extends MyObject> getFilteredList(ImmutableList<? extends MyObject> initial) {
    ArrayList<? extends MyObject> newList = new ArrayList<? extends MyObject>();
    for (MyObject temp: initial) {
        if (doesFulfillCriteria(temp)) newList.add(temp);
    }
    return newList
}

But the line

newList.add(temp);

gives me an error saying that newList expects <? extends MyObject>, found MyObject instead.

Apparently I can't do something like

for (? extends MyObject temp: initial) {

either.

Please help?

4

2 回答 2

1

一个问题是?不能保证多个通配符代表相同的类型。另一个是实例化对象时不允许使用通配符,例如new ArrayList<? extends MyObject>();.

这里的解决方案是使这个方法具有一个上界泛型,因此我们可以在T整个方法中引用相同的内容:

public <T extends MyObject> ImmutableList<T> getFilteredList(ImmutableList<T> initial) {
    ArrayList<T> newList = new ArrayList<T>();
    for (T temp : initial) {
        if (doesFulfillCriteria(temp)) newList.add(temp);
    }
    return newList;
}

此外,ArrayList如果您要返回一个ArrayList.

于 2014-02-21T22:42:27.843 回答
1

一种解决方案是使用以下代码:

public ImmutableList<? extends MyObject> getFilteredList(ImmutableList<? extends   MyObject> initial) {
    List<MyObject> newList = new ArrayList<MyObject>();
    for (MyObject temp: initial) {
        if (doesFulfillCriteria(temp)) newList.add(temp);
    }
    return ImmutableList.copyOf(newList);
}

如果您知道参数扩展了 MyObject,那么您可以直接使用 MyObject,因为所有参数都会扩展它。

您的代码几乎没有问题:

  • 你不能用通配符实例化一个数组?,它必须是具体类型或泛型
  • 你不能返回数组列表,你需要创建一个不可变列表

您还可以使用更多功能的方法:

public ImmutableList<? extends MyObject> getFilteredList(ImmutableList<? extends   MyObject> initial) {

    return ImmutableList.copyOf(Iterables.filter(initial, new Predicate<MyObject>() {
        @Override
        public boolean apply(MyObject o) {
            return doesFulfillCriteria(o);
        }}));
}
于 2014-02-21T22:44:32.297 回答