import java.util.Comparator;
import java.util.Set;

class CastError {
    public void foo(Comparator<? super byte[]> comparator) throws Exception {
        MyComparator comparator1 = (MyComparator) comparator;
    }

    public void foo1(Comparator<byte[]> comparator) throws Exception {
        MyComparator comparator1 = (MyComparator) comparator;
    }

    public void foo2(Comparator<? extends byte[]> comparator) throws Exception {
        MyComparator comparator1 = (MyComparator) comparator;
    }

    public void foo3(Comparator<? super String[]> comparator) throws Exception {
        MyComparator comparator1 = <error descr="Inconvertible types; cannot cast 'java.util.Comparator<capture<? super java.lang.String[]>>' to 'MyComparator'">(MyComparator) comparator</error>;
    }

    public void foo4(Comparator<? extends String[]> comparator) throws Exception {
        MyComparator comparator1 = <error descr="Inconvertible types; cannot cast 'java.util.Comparator<capture<? extends java.lang.String[]>>' to 'MyComparator'">(MyComparator) comparator</error>;
    }

    public void foo5(Comparator<?> comparator) throws Exception {
        MyComparator comparator1 = (MyComparator) comparator;
    }

    //--||--||--||--||--||--||--||--||--||--||--||--||--||--||--||--||--||--||--

    public void sfoo(Set<Comparator<? super byte[]>> comparator) throws Exception {
        Set<MyComparator> comparator1 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Comparator<? super byte[]>>' to 'java.util.Set<MyComparator>'">(Set<MyComparator>) comparator</error>;
    }

    public void sfoo1(Set<Comparator<byte[]>> comparator) throws Exception {
        Set<MyComparator> comparator1 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Comparator<byte[]>>' to 'java.util.Set<MyComparator>'">(Set<MyComparator>) comparator</error>;
    }

    public void sfoo2(Set<Comparator<? extends byte[]>> comparator) throws Exception {
        Set<MyComparator> comparator1 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Comparator<? extends byte[]>>' to 'java.util.Set<MyComparator>'">(Set<MyComparator>) comparator</error>;
    }

    public void sfoo3(Set<Comparator<? super String[]>> comparator) throws Exception {
        Set<MyComparator> comparator1 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Comparator<? super java.lang.String[]>>' to 'java.util.Set<MyComparator>'">(Set<MyComparator>) comparator</error>;
    }

    public void sfoo4(Set<Comparator<? extends String[]>> comparator) throws Exception {
        Set<MyComparator> comparator1 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Comparator<? extends java.lang.String[]>>' to 'java.util.Set<MyComparator>'">(Set<MyComparator>) comparator</error>;
    }

    public void sfoo5(Set<Comparator<?>> comparator) throws Exception {
        Set<MyComparator> comparator1 = <error descr="Inconvertible types; cannot cast 'java.util.Set<java.util.Comparator<?>>' to 'java.util.Set<MyComparator>'">(Set<MyComparator>) comparator</error>;
    }
}

abstract class MyComparator implements Comparator<byte[]> {
}
