了解上限和下限?

Understanding upper and lower bounds on ? in Java Generics

我真的很难理解通配符参数。关于这个我有几个问题。

  • ?作为类型参数只能在方法中使用。例如:printAll(MyList)我不能用?作为类型参数来定义类。

  • 我理解EDOCX1的上界(0)。printAll(MyList)的意思是:"如果有对象实现Serialzable接口,printAll将打印MyList。"我对super有点意见。printAll(MyList)的意思是:"如果MyClass的对象或任何扩展MyClass的类(MyClass的后代),printAll将打印MyList。"

  • 在我出错的地方纠正我。

    简而言之,只有TEKVN可以用作定义泛型类的类型参数。?只能用于方法中更新1:

    1
    2
    3
    public void printAll(MyList<? super MyClass>){
        // code code code
    }

    根据Ivor Horton的书,MyList意味着如果它有MyClass的对象或它实现的任何接口或类,我可以打印MyList。也就是说,MyClass是一个下限。它是继承层次结构中的最后一个类。这意味着我最初的假设是错误的。

    所以,假设MyClass看起来像:

    1
    2
    3
    public class MyClass extends Thread implements ActionListener{
        // whatever
    }

    然后,如果1。清单中有MyClass的对象2。在List中有ThreadActionListener的对象。更新2:

    所以,在阅读了这个问题的许多答案之后,我的理解是:

  • ? extends T是指扩展T的任何类别。因此,我们指的是T的孩子。因此,T是上界。继承层次结构中最上层的类

  • ? super T是指Tsuper的任何类/接口。因此,我们指的是T的所有父母。因此,T是下限。继承层次结构中最低级的类