为什么不能将通配符 (?) 用作参数类型、字段、局部变量或方法的返回类型?

关于泛型通配符的 Oracle 文档说:

通配符可用于各种情况:作为参数,字段局部变量的类型;有时作为返回类型(尽管更好的编程实践是更具体)。

我已经在下面的类中尝试了所有四个,并且每个类都出现了编译器错误。为什么?我做错了什么?

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

}

答案 1

本教程的措辞非常糟糕。不能对列出的任何内容使用通配符。对于这些内容,可以使用带有通配符的泛型类型。

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
    }
}

答案 2

字符是通配符类型参数?

文章开头是

在泛型代码中,问号 (?)称为通配符,表示未知类型。

您可以使用该语法的唯一位置是作为通用代码的一部分,即。泛型类型参数。下一句引用使用通配符的通用代码。例如,

作为参数的类型

你可以有

public static void shuffle(List<?> list) {

或用于

作为局部变量

public void method() {
    List<?> list = Arrays.asList(1, 2, 3);
    Collections.shuffle(list);
    System.out.println(list);
}

通配符从不用作泛型方法调用、泛型类实例创建或超类型的类型参数。

您不能将其用作

Arrays.<?>asList(1, "", '5');
List<?> list = new ArrayList<?>();
...
public class MyList implements List<?> {/* whatever */}

推荐