public class TakesArrayList { // There is a Java user to flag up any problems, as if the .class file differs from my // claimed types above we'll see two overloads and two parameter types instead of one. // Test how Array types with a variance should be lowered: fun invarArray(a: Array) { } fun outArray(a: Array) { } fun inArray(a: Array) { } fun invarInvarArray(a: Array>) { } fun invarOutArray(a: Array>) { } fun invarInArray(a: Array>) { } fun outInvarArray(a: Array>) { } fun outOutArray(a: Array>) { } fun outInArray(a: Array>) { } fun inInvarArray(a: Array>) { } fun inOutArray(a: Array>) { } fun inInArray(a: Array>) { } // Test how Array type arguments with a variance should acquire implicit wildcards: fun invarArrayList(l: List>) { } fun outArrayList(l: List>) { } fun inArrayList(l: List>) { } // Check the cases of nested arrays: fun invarInvarArrayList(l: List>>) { } fun invarOutArrayList(l: List>>) { } fun invarInArrayList(l: List>>) { } fun outInvarArrayList(l: List>>) { } fun outOutArrayList(l: List>>) { } fun outInArrayList(l: List>>) { } fun inInvarArrayList(l: List>>) { } fun inOutArrayList(l: List>>) { } fun inInArrayList(l: List>>) { } // Now check all of that again for Comparable, whose type parameter is contravariant: fun invarArrayComparable(c: Comparable>) { } fun outArrayComparable(c: Comparable>) { } fun inArrayComparable(c: Comparable>) { } fun invarInvarArrayComparable(c: Comparable>>) { } fun invarOutArrayComparable(c: Comparable>>) { } fun invarInArrayComparable(c: Comparable>>) { } fun outInvarArrayComparable(c: Comparable>>) { } fun outOutArrayComparable(c: Comparable>>) { } fun outInArrayComparable(c: Comparable>>) { } fun inInvarArrayComparable(c: Comparable>>) { } fun inOutArrayComparable(c: Comparable>>) { } fun inInArrayComparable(c: Comparable>>) { } // ... duplicate all of that for a final array element (I choose String as a final type), which sometimes suppresses addition of `? extends ...` fun invarArrayListFinal(l: List>) { } fun outArrayListFinal(l: List>) { } fun inArrayListFinal(l: List>) { } fun invarInvarArrayListFinal(l: List>>) { } fun invarOutArrayListFinal(l: List>>) { } fun invarInArrayListFinal(l: List>>) { } fun outInvarArrayListFinal(l: List>>) { } fun outOutArrayListFinal(l: List>>) { } fun outInArrayListFinal(l: List>>) { } fun inInvarArrayListFinal(l: List>>) { } fun inOutArrayListFinal(l: List>>) { } fun inInArrayListFinal(l: List>>) { } fun invarArrayComparableFinal(c: Comparable>) { } fun outArrayComparableFinal(c: Comparable>) { } fun inArrayComparableFinal(c: Comparable>) { } fun invarInvarArrayComparableFinal(c: Comparable>>) { } fun invarOutArrayComparableFinal(c: Comparable>>) { } fun invarInArrayComparableFinal(c: Comparable>>) { } fun outInvarArrayComparableFinal(c: Comparable>>) { } fun outOutArrayComparableFinal(c: Comparable>>) { } fun outInArrayComparableFinal(c: Comparable>>) { } fun inInvarArrayComparableFinal(c: Comparable>>) { } fun inOutArrayComparableFinal(c: Comparable>>) { } fun inInArrayComparableFinal(c: Comparable>>) { } // ... and duplicate it once more with Any as the array element, which can suppress adding `? super ...` fun invarArrayListAny(l: List>) { } fun outArrayListAny(l: List>) { } fun inArrayListAny(l: List>) { } fun invarInvarArrayListAny(l: List>>) { } fun invarOutArrayListAny(l: List>>) { } fun invarInArrayListAny(l: List>>) { } fun outInvarArrayListAny(l: List>>) { } fun outOutArrayListAny(l: List>>) { } fun outInArrayListAny(l: List>>) { } fun inInvarArrayListAny(l: List>>) { } fun inOutArrayListAny(l: List>>) { } fun inInArrayListAny(l: List>>) { } fun invarArrayComparableAny(c: Comparable>) { } fun outArrayComparableAny(c: Comparable>) { } fun inArrayComparableAny(c: Comparable>) { } fun invarInvarArrayComparableAny(c: Comparable>>) { } fun invarOutArrayComparableAny(c: Comparable>>) { } fun invarInArrayComparableAny(c: Comparable>>) { } fun outInvarArrayComparableAny(c: Comparable>>) { } fun outOutArrayComparableAny(c: Comparable>>) { } fun outInArrayComparableAny(c: Comparable>>) { } fun inInvarArrayComparableAny(c: Comparable>>) { } fun inOutArrayComparableAny(c: Comparable>>) { } fun inInArrayComparableAny(c: Comparable>>) { } }