javagenericswildcardbounded-wildcardunbounded-wildcard

Why can't I use the wildcard (?) as type of parameter, field, local variable, or as return type of a method?


The Oracle doc about Wildcards in generics says,

The wildcard can be used in a variety of situations: as the type of a parameter, field, or local variable; sometimes as a return type (though it is better programming practice to be more specific).

I have tried all four in the following class, and got compiler errors on each one. Why? What am I doing wrong?

public class MainClass {
    private ? instanceFieldWithWildCardType;//ERROR
    private static ? staticFieldWithWildCardType;//ERROR

    private void methodWithWildCardParam(? param) {}//ERROR

    private void methodWithWildCardLocalVariable() {
        ? localVariableWithWildCardType;//ERROR
    }

    private ? methodWithWildCardReturnType() {//ERROR
        return null;
    }

    private void methodWithWildCardParam(? param) {}//ERROR

}

Solution

  • The tutorial is terribly phrased. You cannot use a wildcard for any of the things listed. You can use a generic type with a wildcard in it for those things.

    public class Example {
        ? field1;        // invalid
        List<?> field2;  // valid
    
        private ? method1(? param) {return param;}              // invalid
        private List<?> method2(List<?> param) {return param;}  // valid
    
        private void method3() {
            ? var1;        // invalid
            List<?> var2;  // valid
        }
    }