import org.checkerframework.checker.nullness.qual.*;

class WildcardSubtyping2 {
    class MyClass {}

    class MyCloneClass extends MyClass implements Cloneable {}

    class MyGeneric<@NonNull T extends @Nullable MyClass> {}

    class UseMyGeneric {
        MyGeneric<@NonNull MyCloneClass> nonNull = new MyGeneric<>();
        MyGeneric<@Nullable MyCloneClass> nullable = new MyGeneric<>();

        MyGeneric<? extends @NonNull Cloneable> interfaceNN = nonNull;
        MyGeneric<? extends @Nullable Cloneable> interfaceNull = nullable;
    }

    class MyGenericEB<@NonNull T extends @NonNull MyClass> {}

    class UseMyGenericEB {
        MyGenericEB<@NonNull MyCloneClass> nonNull = new MyGenericEB<>();
        // :: error: (type.argument.type.incompatible)
        MyGenericEB<@Nullable MyCloneClass> nullable = new MyGenericEB<>();

        MyGenericEB<? extends @NonNull Cloneable> interfaceNN = nonNull;
        MyGenericEB<? extends @Nullable Cloneable> interfaceNull = nullable;
    }
}
