1 /* 2 * Copyright 2020 The JSpecify Authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package annotatedboundsofwildcard; 17 18 import org.jspecify.annotations.NullMarked; 19 import org.jspecify.annotations.Nullable; 20 import org.jspecify.annotations.NullnessUnspecified; 21 22 @NullMarked 23 public class AnnotatedBoundsOfWildcard { superAsIs( Test<? super Base, ? super @Nullable Base, ? super @NullnessUnspecified Base> a)24 public void superAsIs( 25 // jspecify_nullness_not_enough_information 26 Test<? super Base, ? super @Nullable Base, ? super @NullnessUnspecified Base> a) {} 27 superNotNull(Test<? super Base, ? super Base, ? super Base> a)28 public void superNotNull(Test<? super Base, ? super Base, ? super Base> a) {} 29 superNullable( Test<? super @Nullable Base, ? super @Nullable Base, ? super @Nullable Base> a)30 public void superNullable( 31 // jspecify_nullness_not_enough_information 32 Test<? super @Nullable Base, ? super @Nullable Base, ? super @Nullable Base> a) {} 33 extendsAsIs( Test<? extends Base, ? extends @Nullable Base, ? extends @NullnessUnspecified Base> a)34 public void extendsAsIs( 35 Test<? extends Base, ? extends @Nullable Base, ? extends @NullnessUnspecified Base> a) {} 36 extendsNotNull(Test<? extends Base, ? extends Base, ? extends Base> a)37 public void extendsNotNull(Test<? extends Base, ? extends Base, ? extends Base> a) {} 38 extendsNullable( Test<? extends @Nullable Base, ? extends @Nullable Base, ? extends @Nullable Base> a)39 public void extendsNullable( 40 Test<? extends @Nullable Base, ? extends @Nullable Base, ? extends @Nullable Base> a) {} 41 noBounds( Test< ? extends @NullnessUnspecified Object, ? extends @NullnessUnspecified Object, ? extends @NullnessUnspecified Object> a)42 public void noBounds( 43 Test< 44 ? extends @NullnessUnspecified Object, 45 ? extends @NullnessUnspecified Object, 46 ? extends @NullnessUnspecified Object> 47 a) {} 48 } 49 50 class Base {} 51 52 class Derived extends Base {} 53 54 @NullMarked 55 class Test<T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {} 56 57 @NullMarked 58 class Use { main( Test<Derived, Derived, Derived> aNotNullNotNullNotNull, Test<Derived, Derived, @Nullable Derived> aNotNullNotNullNull, Test<Derived, @Nullable Derived, Derived> aNotNullNullNotNull, Test<Derived, @Nullable Derived, @Nullable Derived> aNotNullNullNull, Test<Object, Object, Object> aObjectNotNullNotNullNotNull, Test<Object, Object, @Nullable Object> aObjectNotNullNotNullNull, Test<Object, @Nullable Object, Object> aObjectNotNullNullNotNull, Test<Object, @Nullable Object, @Nullable Object> aObjectNotNullNullNull, AnnotatedBoundsOfWildcard b)59 public void main( 60 Test<Derived, Derived, Derived> aNotNullNotNullNotNull, 61 // jspecify_nullness_not_enough_information 62 Test<Derived, Derived, @Nullable Derived> aNotNullNotNullNull, 63 Test<Derived, @Nullable Derived, Derived> aNotNullNullNotNull, 64 // jspecify_nullness_not_enough_information 65 Test<Derived, @Nullable Derived, @Nullable Derived> aNotNullNullNull, 66 // 67 Test<Object, Object, Object> aObjectNotNullNotNullNotNull, 68 // jspecify_nullness_not_enough_information 69 Test<Object, Object, @Nullable Object> aObjectNotNullNotNullNull, 70 Test<Object, @Nullable Object, Object> aObjectNotNullNullNotNull, 71 // jspecify_nullness_not_enough_information 72 Test<Object, @Nullable Object, @Nullable Object> aObjectNotNullNullNull, 73 // 74 AnnotatedBoundsOfWildcard b) { 75 // jspecify_nullness_mismatch 76 b.superAsIs(aObjectNotNullNotNullNotNull); 77 // jspecify_nullness_mismatch 78 b.superAsIs(aObjectNotNullNotNullNull); 79 // jspecify_nullness_not_enough_information 80 b.superAsIs(aObjectNotNullNullNotNull); 81 b.superAsIs(aObjectNotNullNullNull); 82 83 b.superNotNull(aObjectNotNullNotNullNotNull); 84 b.superNotNull(aObjectNotNullNotNullNull); 85 b.superNotNull(aObjectNotNullNullNotNull); 86 b.superNotNull(aObjectNotNullNullNull); 87 88 // jspecify_nullness_mismatch 89 b.superNullable(aObjectNotNullNotNullNotNull); 90 // jspecify_nullness_mismatch 91 b.superNullable(aObjectNotNullNotNullNull); 92 // jspecify_nullness_mismatch 93 b.superNullable(aObjectNotNullNullNotNull); 94 // jspecify_nullness_mismatch 95 b.superNullable(aObjectNotNullNullNull); 96 97 b.extendsAsIs(aNotNullNotNullNotNull); 98 // jspecify_nullness_not_enough_information 99 b.extendsAsIs(aNotNullNotNullNull); 100 b.extendsAsIs(aNotNullNullNotNull); 101 // jspecify_nullness_not_enough_information 102 b.extendsAsIs(aNotNullNullNull); 103 104 b.extendsNotNull(aNotNullNotNullNotNull); 105 // jspecify_nullness_mismatch 106 b.extendsNotNull(aNotNullNotNullNull); 107 // jspecify_nullness_mismatch 108 b.extendsNotNull(aNotNullNullNotNull); 109 // jspecify_nullness_mismatch 110 b.extendsNotNull(aNotNullNullNull); 111 112 b.extendsNullable(aNotNullNotNullNotNull); 113 b.extendsNullable(aNotNullNotNullNull); 114 b.extendsNullable(aNotNullNullNotNull); 115 b.extendsNullable(aNotNullNullNull); 116 117 b.noBounds(aNotNullNotNullNotNull); 118 // jspecify_nullness_not_enough_information 119 b.noBounds(aNotNullNotNullNull); 120 // jspecify_nullness_not_enough_information 121 b.noBounds(aNotNullNullNotNull); 122 // jspecify_nullness_not_enough_information 123 b.noBounds(aNotNullNullNull); 124 } 125 } 126