public class UsingReadOnlyInterfaces {
    public static class Collections {
        public static <E> void useICollection(ICollection<E> iCollection, E elem, java.util.Collection<E> other) {
            java.util.Iterator<E> iter = iCollection.iterator();
            iCollection.addAll(other);
            iCollection.add(elem);
            iCollection.isEmpty();
            iCollection.clear();
            // this is not an error when analyzing against kotlin sources (which is a bug), this inconsistency is hard to fix with the current approach
            // KT-22594
            // iCollection.getSize();
            iCollection.size();
        }

        public static <E> void useCCollection(CCollection<E> cCollection, E elem, java.util.Collection<E> other) {
            java.util.Iterator<E> iter = cCollection.iterator();
            cCollection.addAll(other);
            cCollection.add(elem);
            cCollection.isEmpty();
            cCollection.clear();
            cCollection.getSize();
            cCollection.size();
            cCollection.contains(elem);
            cCollection.contains("sasd");
            cCollection.removeAll(other);
            cCollection.retainAll(other);
        }

        public static class ExtendCCollection extends CCollection<String> {
            @Override
            public void clear() {}
        }
    }

    public static class Maps {
        public static <E, V> void useCMap(CMap<E, V> cMap) {
            cMap.isEmpty();
            java.util.Set<E> s = cMap.getKeys();
            s = cMap.keySet();
            java.util.Collection<V> v = cMap.getValues();
            v = cMap.values();
            java.util.Set<java.util.Map.Entry<E, V>> e = cMap.entrySet();
            e = cMap.getEntries();
        }
    }
}