Java泛型入参使用子类

在Java中,泛型是一种参数化类型的概念,它使得我们能够在编写代码时指定类或方法可以接受的数据类型,从而增加代码的灵活性和重用性。在使用泛型时,我们经常会遇到需要使用子类作为泛型入参的情况,这时就需要注意一些细节。

泛型入参使用子类的问题

在Java中,泛型是不支持协变的,也就是说,如果一个方法接受的泛型类型是List<Animal>,那么List<Dog>就不能直接作为参数传入,这是因为List<Dog>并不是List<Animal>的子类型。

然而,在某些情况下,我们希望能够接受子类作为泛型入参,这时就需要使用通配符?来实现。

使用通配符解决问题

通过使用通配符?,我们可以实现泛型入参接受子类的需求。下面是一个简单的示例代码:

public class Test {
    public static void printList(List<? extends Animal> list) {
        for(Animal animal : list) {
            System.out.println(animal.getName());
        }
    }

    public static void main(String[] args) {
        List<Dog> dogs = new ArrayList<>();
        dogs.add(new Dog("Buddy"));
        dogs.add(new Dog("Max"));

        printList(dogs);
    }
}

class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
}

在上面的示例中,printList方法接受一个List<? extends Animal>类型的参数,这意味着它可以接受任何继承自Animal类的子类的列表作为参数,包括List<Dog>

总结

通过使用通配符?,我们可以实现泛型入参接受子类的需求,从而提高代码的灵活性和重用性。在实际开发中,我们可以根据具体的需求来灵活运用通配符来处理泛型入参的情况,从而编写出更加灵活和高效的代码。

希望本文对你理解Java泛型入参使用子类有所帮助!