class SafeIterableMap implements Iterable<Map.Entry<K, V>> {

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof SafeIterableMap)) {
            return false;
        }
        SafeIterableMap map = (SafeIterableMap) obj;
        if (this.size() != map.size()) {
            return false;
        }
        Iterator<Map.Entry<K, V>> iterator1 = iterator();
        Iterator iterator2 = map.iterator();
        while (iterator1.hasNext() && iterator2.hasNext()) {
            Map.Entry<K, V> next1 = iterator1.next();
            Object next2 = iterator2.next();
            if ((next1 == null && next2 != null)
                    || (next1 != null && !next1.equals(next2))) {
                return false;
            }
        }
        return !iterator1.hasNext() && !iterator2.hasNext();
    }

}

class SafeIterableMapTest {

    @Test
    public void testEquality3() {

        SafeIterableMap<Integer, Boolean> map = mapOf(1, 2, 3, 4);
        //noinspection EqualsBetweenInconvertibleTypes
        assertThat(map.equals(new ArrayList<>()), is(false));
    }

}