返回

学霸是这样理解泛型型变的(初)

Android

理解泛型型变是一个进阶性的难题,新手一看就是一脸懵逼。泛型的概念又太多,而且每个概念和后面的都有关系。只要前面有一个地方未理解后面的难点更是会越来越看不懂。为了让初学者们能轻松理解和掌握泛型型变,今天我们一起来看看博主是怎么一步步学习它最终理解和应用它的吧!

泛型型变可以分为协变(covariant)和逆变(contravariant)。

协变是指子类对象可以被赋值给父类变量。

逆变是指父类对象可以被赋值给子类变量。

举个例子:

class Animal {}

class Dog extends Animal {}

class Cat extends Animal {}


List<Animal> animals = new ArrayList<>();

animals.add(new Dog()); // 协变

animals.add(new Cat()); // 协变

这段代码中,Dog和Cat都是Animal的子类。因此,Dog和Cat对象可以被赋值给Animal类型的变量。这就是协变。

再举个例子:

class AnimalFeeder {

    public void feed(Animal animal) {}
}

class DogFeeder extends AnimalFeeder {

    @Override
    public void feed(Dog dog) {}
}

class CatFeeder extends AnimalFeeder {

    @Override
    public void feed(Cat cat) {}
}


AnimalFeeder animalFeeder = new AnimalFeeder();

animalFeeder.feed(new Dog()); // 逆变

animalFeeder.feed(new Cat()); // 逆变

这段代码中,DogFeeder和CatFeeder都是AnimalFeeder的子类。因此,DogFeeder和CatFeeder对象可以被赋值给AnimalFeeder类型的变量。这就是逆变。

协变和逆变都是泛型型变中的重要概念。理解了这两个概念,就可以更好地理解泛型型变的难点和重点。

泛型型变的难点和重点主要在于:

  • 协变和逆变的概念理解起来比较抽象。

  • 泛型型变的规则比较复杂。

  • 泛型型变在实际应用中经常遇到。

初学者在学习泛型型变时,可以先从协变和逆变的概念入手。理解了这两个概念之后,再学习泛型型变的规则。最后,通过一些实际案例来巩固对泛型型变的理解。

泛型型变是Kotlin中一个比较难理解的概念。但是,只要掌握了正确的学习方法,就能轻松理解和掌握它。