当我尝试实现自己的ImmutableList(实际上是委派给基础列表的包装器)时,出现以下编译器错误:

ImmutableListWrapper is not abstract and does not override abstract method isPartialView() in com.google.common.collect.ImmutableCollection

但是实际上,重写isPartialView()似乎是不可能的,因为它受程序包保护,并且我想在自己的程序包中声明包装器。

为什么我不简单地扩展ImmutableCollection?因为我希望ImmutableList.copyOf()返回我的实例而不进行防御性复制。

我能想到的唯一方法是在guava的包中声明一个子类,该子类将isPartialView()从受保护的包更改为公共包,然后由我的包装程序对其进行扩展。有没有更清洁的方法?

我要做什么

我试图通过创建一个包装来修复https://github.com/google/guava/issues/2029,该包装将委派给除spliterator()以外的所有方法的基础ImmutableList,它将被覆盖。

我在假设用户可以定义类型为ImmutableList的变量的情况下工作,并希望包装器可以直接替换(即,不足以实现List,他们期望的是ImmutableList)。

最佳答案

如果您想要自己的不可变列表,但又不想实现,则只需使用ForwardingList。另外,要实际制作副本,请使用Iterator作为copyOf的参数。这是一个应满足您在问题和答案中描述的所有要求的解决方案。

public final class MyVeryOwnImmutableList<T> extends ForwardingList<T> {
  public static <T> MyVeryOwnImmutableList<T> copyOf(List<T> list) {
    // Iterator forces a real copy. List or Iterable doesn't.
    return new MyVeryOwnImmutableList<T>(list.iterator());
  }

  private final ImmutableList<T> delegate;

  private MyVeryOwnImmutableList(Iterator<T> it) {
    this.delegate = ImmutableList.copyOf(it);
  }

  @Override
  protected List<T> delegate()
  {
    return delegate;
  }
}

关于java - 如何继承 Guava 的ImmutableList?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31666718/

10-11 02:36