import org.checkerframework.checker.nullness.qual.Nullable; class Generic<G extends @Nullable Object> {} class MyClass extends Generic<MyClass> {} class BoundedGeneric<B extends @Nullable CharSequence> {} class RawTypes { Generic rawReturn() { return new Generic(); } Generic rawField = new Generic(); void use() { Generic rawLocal = new Generic<String>(); Generic<?> generic1 = rawReturn(); Generic<?> generic2 = rawField; Generic<?> generic3 = rawLocal; } } class TestBounded { BoundedGeneric rawReturn() { return new BoundedGeneric<>(); } BoundedGeneric rawField = new BoundedGeneric(); void useWildCard() { BoundedGeneric rawLocal = new BoundedGeneric<String>(); BoundedGeneric<?> generic1 = rawReturn(); BoundedGeneric<?> generic2 = rawField; BoundedGeneric<?> generic3 = rawLocal; } void useBoundedWildCard() { BoundedGeneric rawLocal = new BoundedGeneric<String>(); //:: warning: [unchecked] unchecked conversion BoundedGeneric<? extends Object> generic1 = rawReturn(); //:: warning: [unchecked] unchecked conversion BoundedGeneric<? extends Object> generic2 = rawField; //:: warning: [unchecked] unchecked conversion BoundedGeneric<? extends Object> generic3 = rawLocal; } void useBoundedWildCard2() { BoundedGeneric rawLocal = new BoundedGeneric<String>(); //:: warning: [unchecked] unchecked conversion BoundedGeneric<? extends CharSequence> generic1 = rawReturn(); //:: warning: [unchecked] unchecked conversion BoundedGeneric<? extends CharSequence> generic2 = rawField; //:: warning: [unchecked] unchecked conversion BoundedGeneric<? extends CharSequence> generic3 = rawLocal; } void useTypeArg() { BoundedGeneric rawLocal = new BoundedGeneric<String>(); //:: warning: [unchecked] unchecked conversion BoundedGeneric<String> generic1 = rawReturn(); //:: warning: [unchecked] unchecked conversion BoundedGeneric<String> generic2 = rawField; //:: warning: [unchecked] unchecked conversion BoundedGeneric<String> generic3 = rawLocal; } void useAnnotatedTypeArg() { BoundedGeneric rawLocal = new BoundedGeneric<String>(); //:: warning: [unchecked] unchecked conversion BoundedGeneric<@Nullable String> generic1 = rawReturn(); //:: warning: [unchecked] unchecked conversion BoundedGeneric<@Nullable String> generic2 = rawField; //:: warning: [unchecked] unchecked conversion BoundedGeneric<@Nullable String> generic3 = rawLocal; } }