Java泛型

泛型主要目的是解决ClassCastException的问题,在进行对象的向下转型时都会存在安全隐患,Java希望通过泛型来解决此问题。
泛型的本质在于:类中的属性或方法的参数与返回值类型可以由对象实例化的时候动态决定。
编写泛型类时,要特别注意,泛型类型不能用于静态方法。
当不设置泛型类型时,会默认为Object类型。
注意:
1. 泛型中只允许设置引用类型,如果现在要操作基本类型必须使用包装类
2. 从jdk1.7后,泛型的格式为:Point<引用类型> point= Point<>();
3. 泛型不能和instanceof一起使用。
使用泛型可以解决大部分的类对象的强制转换处理。

在这里插入图片描述
要想可以接收所有的泛型类型,并且不能够修改里面的数据(允许获取),那么就需要通过通配符“ ? ”解决。

在这里插入图片描述
在这个基础上,这个通配符还提供有两个小的通配符:
1. ?extends 类 :设置泛型的上限。
eg: ? extends Number 表示该泛型类型只允许设置Number或Number的子类;

注意到List<? extends Integer>的限制:
• 允许调用get()方法获取Integer的引用;
• 不允许调用set(? extends Integer)方法并传入任何Integer的引用(null除外)。
因此,方法参数类型List<? extends Integer>表明了该方法内部**只会读取List的元素,不会修改List的元素(因为无法调用add(? extends Integer)、remove(? extends Integer)这些方法。**换句话说,这是一个对参数List<? extends Integer>进行只读的方法(恶意调用set(null)除外)。
2. ?super 类 :设置泛型的下限
eg: ? super String 表示该泛型只允许设置String或其父类

因此,使用<? super Integer>通配符表示:
• 允许调用set(? super Integer)方法传入Integer的引用;
• 不允许调用get()方法获得Integer的引用。
唯一例外是可以获取Object的引用:Object o = p.getFirst()。
换句话说,使用<? super Integer>通配符作为方法参数,表示方法内部代码对于参数只能写,即set(),不能读,即get()

泛型接口:
泛型除了能在类中定义,也能在接口中定义。
对于泛型接口的子类有两种实现方式:
第一种:在子类中继续设置泛型定义
在这里插入图片描述第二种:在子类实现父接口的时候直接定义出具体泛型类型
在这里插入图片描述
泛型方法:

泛型方法中不一定要出现在泛型类中。
范例:定义一个泛型方法:
在这里插入图片描述
Java的泛型是采用擦拭法实现的;
擦拭法决定了泛型:
• 不能是基本类型,例如:int;
• 不能获取带泛型类型的Class,例如:Pair.class;
• 不能判断带泛型类型的类型,例如:x instanceof Pair;
• 不能实例化T类型,例如:new T()。
泛型方法要防止重复定义方法,例如:public boolean equals(T obj);
子类可以获取父类的泛型类型
子类对象可以转换为父类对象,但是子类泛型不能转换成父类泛型。

 class Student extends Person;
Student s =new Student();
Person p =new Person();
p=s; //子类转父类,可以转换

ArrayList<Person> p1=new ArrayList<>();
ArrayList<Student>  s1=new ArrayList<>();
p1=s1;//子类泛型转换成父类泛型,不能转换

小结
1. 使用泛型时,把泛型参数替换为需要的class类型,例如:ArrayList,ArrayList等;
2. 可以省略编译器能自动推断出的类型,例如:List list = new ArrayList<>();;
3. 不指定泛型参数类型时,编译器会给出警告,且只能将视为Object类型;
4. 可以在接口中定义泛型类型,实现此接口的类必须实现正确的泛型类型

我们已经讨论了<? extends T>和<? super T>作为方法参数的作用。实际上,Java的泛型还允许使用无限定通配符(Unbounded Wildcard Type),即只定义一个?
void sample(Pair<?> p) {}

因为<?>通配符既没有extends,也没有super,因此:
• 不允许调用set(T)方法并传入引用(null除外);
• 不允许调用T get()方法并获取T引用(只能获取Object引用)。
换句话说,既不能读,也不能写,那只能做一些null判断:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值