ObservableList extends AbstractObservableValue<List<? extends E>> implements List<E>,
                                                                                                   SettableValue<List<? extends E>> { @Override public int indexOf(Object o) { return myInnerList.indexOf(o); } 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 testIndexOf() { ObservableList<String> list = new ObservableList<>(); list.add("A"); list.add("B"); list.add("C"); list.add("B"); assertThat(list.indexOf("B")).isEqualTo(1); assertThat(list.get(2)).isEqualTo("C"); assertThat(list.lastIndexOf("B")).isEqualTo(3); }