import java.util.* class Itr : Iterator by ArrayList().iterator() class MItr : MutableIterator by ArrayList().iterator() class LItr : ListIterator by ArrayList().listIterator() class MLItr : MutableListIterator by ArrayList().listIterator() class It : Iterable by ArrayList() class MIt : MutableIterable by ArrayList() class C : Collection by ArrayList() class MC : MutableCollection by ArrayList() class L : List by ArrayList() class ML : MutableList by ArrayList() class S : Set by HashSet() class MS : MutableSet by HashSet() class M : Map by HashMap() class MM : MutableMap by HashMap() class ME : Map.Entry { override val key: String get() = throw UnsupportedOperationException() override val value: String get() = throw UnsupportedOperationException() } class MME : MutableMap.MutableEntry { override val key: String get() = throw UnsupportedOperationException() override val value: String get() = throw UnsupportedOperationException() override fun setValue(value: String): String = throw UnsupportedOperationException() } inline fun safeAsReturnsNull(operation: String, cast: () -> Any?) { try { val x = cast() assert(x == null) { "$operation: should return null, got $x" } } catch (e: Throwable) { throw AssertionError("$operation: should not throw exceptions, got $e") } } inline fun safeAsReturnsNonNull(operation: String, cast: () -> Any?) { try { val x = cast() assert(x != null) { "$operation: should return non-null" } } catch (e: Throwable) { throw AssertionError("$operation: should not throw exceptions, got $e") } } fun box(): String { val itr = Itr() as Any val mitr = MItr() safeAsReturnsNull("itr as? MutableIterator") { itr as? MutableIterator<*> } safeAsReturnsNonNull("mitr as? MutableIterator") { mitr as? MutableIterator<*> } val litr = LItr() as Any val mlitr = MLItr() safeAsReturnsNull("litr as? MutableIterator") { litr as? MutableIterator<*> } safeAsReturnsNull("litr as? MutableListIterator") { litr as? MutableListIterator<*> } safeAsReturnsNonNull("mlitr as? MutableIterator") { mlitr as? MutableIterator<*> } safeAsReturnsNonNull("mlitr as? MutableListIterator") { mlitr as? MutableListIterator<*> } val it = It() as Any val mit = MIt() val arrayList = ArrayList() safeAsReturnsNull("it as? MutableIterable") { it as? MutableIterable<*> } safeAsReturnsNonNull("mit as? MutableIterable") { mit as? MutableIterable<*> } safeAsReturnsNonNull("arrayList as? MutableIterable") { arrayList as? MutableIterable<*> } val coll = C() as Any val mcoll = MC() safeAsReturnsNull("coll as? MutableIterable") { coll as? MutableIterable<*> } safeAsReturnsNull("coll as? MutableCollection") { coll as? MutableCollection<*> } safeAsReturnsNonNull("mcoll as? MutableIterable") { mcoll as? MutableIterable<*> } safeAsReturnsNonNull("mcoll as? MutableCollection") { mcoll as? MutableCollection<*> } safeAsReturnsNonNull("arrayList as? MutableCollection") { arrayList as? MutableCollection<*> } val list = L() as Any val mlist = ML() safeAsReturnsNull("list as? MutableIterable") { list as? MutableIterable<*> } safeAsReturnsNull("list as? MutableCollection") { list as? MutableCollection<*> } safeAsReturnsNull("list as? MutableList") { list as? MutableList<*> } safeAsReturnsNonNull("mlist as? MutableIterable") { mlist as? MutableIterable<*> } safeAsReturnsNonNull("mlist as? MutableCollection") { mlist as? MutableCollection<*> } safeAsReturnsNonNull("mlist as? MutableList") { mlist as? MutableList<*> } val set = S() as Any val mset = MS() val hashSet = HashSet() safeAsReturnsNull("set as? MutableIterable") { set as? MutableIterable<*> } safeAsReturnsNull("set as? MutableCollection") { set as? MutableCollection<*> } safeAsReturnsNull("set as? MutableSet") { set as? MutableSet<*> } safeAsReturnsNonNull("mset as? MutableIterable") { mset as? MutableIterable<*> } safeAsReturnsNonNull("mset as? MutableCollection") { mset as? MutableCollection<*> } safeAsReturnsNonNull("mset as? MutableSet") { mset as? MutableSet<*> } safeAsReturnsNonNull("hashSet as? MutableSet") { hashSet as? MutableSet<*> } val map = M() as Any val mmap = MM() val hashMap = HashMap() safeAsReturnsNull("map as? MutableMap") { map as? MutableMap<*, *> } safeAsReturnsNonNull("mmap as? MutableMap") { mmap as? MutableMap<*, *> } safeAsReturnsNonNull("hashMap as? MutableMap") { hashMap as? MutableMap<*, *> } val entry = ME() as Any val mentry = MME() safeAsReturnsNull("entry as? MutableMap.MutableEntry") { entry as? MutableMap.MutableEntry<*, *> } safeAsReturnsNonNull("mentry as? MutableMap.MutableEntry") { mentry as? MutableMap.MutableEntry<*, *> } hashMap[""] = "" val hashMapEntry = hashMap.entries.first() safeAsReturnsNonNull("hashMapEntry as? MutableMap.MutableEntry") { hashMapEntry as? MutableMap.MutableEntry<*, *> } safeAsReturnsNull("null as? MutableIterator") { null as? MutableIterator<*> } safeAsReturnsNull("null as? MutableListIterator") { null as? MutableListIterator<*> } safeAsReturnsNull("null as? MutableIterable") { null as? MutableIterable<*> } safeAsReturnsNull("null as? MutableCollection") { null as? MutableCollection<*> } safeAsReturnsNull("null as? MutableList") { null as? MutableList<*> } safeAsReturnsNull("null as? MutableSet") { null as? MutableSet<*> } safeAsReturnsNull("null as? MutableMap") { null as? MutableMap<*, *> } safeAsReturnsNull("null as? MutableMap.MutableEntry") { null as? MutableMap.MutableEntry<*, *> } safeAsReturnsNull("mlist as? MutableSet") { mlist as? MutableSet<*> } safeAsReturnsNull("mlist as? MutableIterator") { mlist as? MutableIterator<*> } return "OK" }