当我尝试实现自己的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/