ObservableList extends AbstractObservableValue<List<? extends E>> implements List<E>,
                                                                                                   SettableValue<List<? extends E>> { @NotNull @Override public List<E> subList(int fromIndex, int toIndex) { return myInnerList.subList(fromIndex, toIndex); } ObservableList();  ObservableList(@NotNull Iterable<? extends E> otherCollection); void beginUpdate(); void endUpdate(); @Override int size(); @Override boolean isEmpty(); @Override boolean contains(Object o); @NotNull @Override Iterator<E> iterator(); @NotNull @Override Object[] toArray(); @NotNull @Override T[] toArray(T[] a); @Override boolean add(E e); @Override boolean remove(Object o); @Override boolean containsAll(Collection<?> c); @Override boolean addAll(Collection<? extends E> c); boolean setAll(@NotNull Collection<? extends E> c); @Override boolean addAll(int index, Collection<? extends E> c); @Override boolean removeAll(Collection<?> c); @Override boolean retainAll(Collection<?> c); @Override void clear(); @Nullable @Override E get(int index); @Nullable @Override E set(int index, E element); @Override void add(int index, E element); @Nullable @Override E remove(int index); @Override int indexOf(Object o); @Override int lastIndexOf(Object o); @NotNull @Override ListIterator<E> listIterator(); @NotNull @Override ListIterator<E> listIterator(int index); @NotNull @Override List<E> subList(int fromIndex, int toIndex); @Override int hashCode(); @Override boolean equals(Object o); @Override String toString(); @NotNull @Override List<E> get(); @Override void set(@NotNull List<? extends E> value);  }
@Test public void testSublist() throws Exception { ObservableList<String> list = new ObservableList<>(); list.add("A"); list.add("B"); list.add("C"); List<String> sublist = list.subList(1, 3); assertThat(sublist).containsExactly("B", "C"); }