gpt4 book ai didi

java - 委托(delegate)协变集合

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:20:52 25 4
gpt4 key购买 nike

我的(精炼)场景:

假设我有一个名为 Interface 的接口(interface), 和一个 class Foo implements Interface .

我还有一个通用的可迭代“结果”类,除其他外,它委托(delegate)给一个集合来完成可迭代的事情。 Result 类做其他与问题无关的事情。所以:

class Result<E> implements Iterable<E> {

private Collection<E> delegate;

public Result(Collection<E> delegate) {
this.delegate = delegate;
}

public Iterator<E> iterator() {
return delegate.iterator();
}

// ... other irrelevant stuff.
}

集合传递到 Result可能是巨大的,而 Result 的用户对象可能会在几个元素之后停止迭代(但我无法控制有多少)。

然后,我有另一个类,我们称它为 Query,它内部包含一个 Foo 的集合。 s,但需要能够返回结果。目前看起来像这样:

class Query {
private Collection<Foo> data;

public Result<Interface> getAllData() {
return new Result<Interface>(new ArrayList<Interface>(data));
}

// EDIT: Not all Result objects are of Interfaces.
public Result<SomeUnrelatedInterface> getSomeOtherData() {
return ...;
}
}

所以 getAllData获取数据的副本(作为 ArrayList<Interface> ),并将其传递给新的 Result为代表团。这对我来说并不理想,因为该集合可能很大,结果的接收者可能只需要前几个结果。

现在开始提问:

谁能想出改变的方法,这样我就不需要拿走具体 Collection 的副本了?

理想情况下,我想要 Result s 的构造函数是 public Result(Collection<? extends E> delegate) (像大多数 Collection 一样),并让它以某种方式使该集合适应 Collection<E> ,但我一直无法弄清楚它可能是什么样子。

最佳答案

以下变体适合您吗?

class Result<E extends Interface>
implements Iterable<E> {

private Collection<E> delegate;

public Result(Collection<E> delegate) {
this.delegate = delegate;
}
public Iterator<E> iterator() {
return delegate.iterator();
}
}
class Query {
private Collection<Foo> data;

public Result<? extends Interface> getAllData() {
return new Result<Foo>(data);
}
}

关于java - 委托(delegate)协变集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12595078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com