泛型的通配符

 public static void main(String[] args) {
        /*
        泛型不具备继承性,但是数据具有继承性
         */

        //创建集合的对象
        ArrayList<ye> list1=new ArrayList<>();
        //ArrayList<fu> list2=new ArrayList<>();
        //ArrayList<zi> list3=new ArrayList<>();

        //调用method
        method(list1);
        //method(list2);报错
        //method(list3);报错

        //数据具有继承性
        list.add(list1);
        list.add(list2);
        list.add(list3);
    }

    public static void method(ArrayList<ye> list){}
}
class ye{}
class fu extends ye{}
class zi extends fu{}

泛型不具备继承性,但是数据具备继承性

方法调用时,父类泛型只能接受本类型的对象,不可以接受继承于父类的子类对象。

数据具备继承性,集合添加数据时可以是子类类型。

泛型的通配符

想要在集合中传入什么类型的数据,加入泛型进行限制。 


     弊端:

     泛型里写的是什么类型的数据,就只能传输什么类型的数据,不可以传入多个类型的数据
    利用泛型方法有一个小弊端,此时他可以接受任意的数据类型

    希望:

     本方法虽然不确定类型,但是只希望能传递ye fu zi
    但泛型不具备继承性,不可以使用ye

   解决方案:

    此时我们可以使用泛型的通配符:
    ?也表示不确定的类型
    他可以进行类型的限定
    ?extends E:表示可以传递E或者E的所有子类型
    ?super E:表示可以传递E或者E所有的父类型

    应用场景:


    1、如果我们在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口
    2、如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以使用通配符

关键点:    

        可以限定类型的范围。

 public static void main(String[] args) {
        ArrayList<ye> list1=new ArrayList<>();
        ArrayList<fu> list2=new ArrayList<>();
        ArrayList<zi> list3=new ArrayList<>();

        method(list1);
        method(list2);
        method(list3);
    }

    /*
    此时泛型里写的是什么类型的数据,就只能传输什么类型的数据
    弊端:
    利用泛型方法有一个小弊端,此时他可以接受任意的数据类型

    希望:本方法虽然不确定类型,但是只希望能传递ye fu zi
    但泛型不具备继承性,不可以使用ye

    此时我们可以使用泛型的通配符:
    ?也表示不确定的类型
    他可以进行类型的限定
    ?extends E:表示可以传递E或者E的所有子类型
    ?super E:表示可以传递E或者E所有的父类型

    应用场景:
    1、如果我们在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口
    2、如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以使用通配符

    泛型的通配符:
        关键点:可以限定类型的范围。
     */
    public static<E> void method(ArrayList<E> list){}

    public static void method1(ArrayList<? extends ye> list){

    }

Java泛型通配符用于解决类型安全问题,并提供了一种方法来引用类型,而不需要知道具体的类型参数。通配符主要有以下几种形式: 1. `?`:无界通配符,表示未知的类型,可以匹配任何对象的类型。 2. `<? extends 类或接口>`:表示具体的类型,但不是确定的类型。`extends`在这里的意思是“某种类型的子类”。这可以用来限定类型参数的上界,只允许该通配符引用某个类型或其子类型。 3. `<? super 类或接口>`:表示具体的类型,但不是确定的类型。`super`在这里的意思是“某种类型的父类”。这可以用来限定类型参数的下界,只允许该通配符引用某个类型或其父类型。 4. `? extends 类型1 & 类型2 & ... & 类型n>`:表示有限制的通配符,可以引用同时满足多个上限类型约束的类型。 使用泛型通配符的目的是为了增强代码的灵活性,同时保证类型安全。例如,如果有一个泛型方法需要接受任何类型的`List`作为参数,但不想限制这个`List`只能包含特定类型的对象,那么可以使用无界通配符`<?>`。 下面是一个简单的例子,来说明如何使用泛型通配符: ```java public class GenericWildcardExample { public static void processElements(List<?> elements) { for (Object element : elements) { // 处理元素,但不知道元素的实际类型 } } } ``` 在这个例子,`processElements`方法可以接受任何类型的`List`对象作为参数,但在方法内部,我们只能将元素当作`Object`类型来处理。 使用泛型通配符的注意事项: - 不能实例化泛型通配符。 - 不能使用带有泛型通配符的类型作为方法的参数类型,因为这会导致在调用时出现类型安全问题。 - 如果要向泛型集合添加元素,那么只能添加`Object`类型的元素,因为编译器不知道集合具体存储的是哪种类型的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值