1

首先很抱歉标题不是很具体,但我找不到更好更简短的描述性标题!

我有一个这样的接口:

public interface ModelInterface {        
    public List<? extends Umbrella> getBRs();
}

以及这种模式的几个实现类:

public class Model implements ModelInterface {
    // need to use the concrete impl here because of JPA
    List<StoneUmbrella> _list = new ArrayList<>(); 

    @Override
    public List<? extends Umbrella> getBRs() {
        return _list;
    }
}

到目前为止,一切都很好。但我也有以下 Util 类:

import java.util.Collection;

public abstract class Util<E, R> {

    public R reduce(Collection<E> collection, R initialElement) {
        R result = initialElement;
        for (E currElement : collection) {
            result = reduce(result, currElement);
        }
        return result;
    }

    abstract R reduce(R initialElement, E element);
}

现在,当我尝试在我的主代码中调用该实用程序类时,就会出现问题:

import java.util.List;

public class Main {
    public static void main(String[] args) {
        ModelInterface model = new Model();

        List<? extends Umbrella> list = model.getBRs();

        Util<Umbrella, Boolean> util = new Util<Umbrella, Boolean>() {
            @Override
            Boolean reduce(Boolean initialElement, Umbrella element) {
                return Boolean.TRUE;
            }
        };

        util.reduce(list, Boolean.FALSE);
    }
}

util.reduce行无法编译并显示此消息:Util 类型中的方法 reduce(Collection, Boolean) 不适用于参数 (List<capture#2-of ? extends Umbrella>, Boolean)

当我使用 List<Umbrella> 而不是 List<? extends Umbrella> 但我无法在模型接口中更改它,否则我将无法在 getter 中返回其内部列表。我有点认为以双方都满意的方式实施它是不可能的。

任何人都可以帮忙吗?提前致谢!!

4

3 回答 3

1

此变体编译:

public class ListUmbrella {
    public static void main(String[] args) {
        ModelInterface<StoneUmbrella> model = new Model();
        List<StoneUmbrella> list = model.getBRs();
        Util<StoneUmbrella, Boolean> util = new Util<StoneUmbrella, Boolean>() {
            @Override
            Boolean reduce(Boolean initialElement, StoneUmbrella element) {
                return Boolean.TRUE;
            }
        };

        util.reduce(list, Boolean.FALSE);
    }
}

interface ModelInterface<T extends Umbrella> {
    public List<T> getBRs();
}

class Model implements ModelInterface<StoneUmbrella> {
    List<StoneUmbrella> _list = new ArrayList<StoneUmbrella>();

    @Override
    public List<StoneUmbrella> getBRs() {
        return _list;
    }
}
于 2013-10-16T12:16:21.590 回答
1

泛型中的参数需要完全相同。您不能在此处遵循继承层次结构。你想要做的是有效的

Collection<Umbrella> test = new ArrayList<StoneUmbrella>();

但你应该这样做

Collection<StoneUmbrella> test = new ArrayList<StoneUmbrella>();

不确定您可以使用 Model 类做什么。但我会尝试将其更改为以下内容并相应地解决它。

public interface ModelInterface<T extends Umbrella> {        
    public List<T> getBRs();
}

如果您需要上述解决方案的完整代码,请告诉我。如果您真的无法对 ModelInterface 做任何事情并且我没有任何其他好的答案,请不要超载。

于 2013-10-16T12:17:07.500 回答
-1

util.reduce 方法的语法有错误。请将其更正为:

 public R reduce(Collection<? extends E> collection, R initialElement) 
于 2013-10-16T11:59:14.617 回答