Java基础-泛型的应用(类、接口、参数、返回值、继承、通配符)
1.位置与作用
- 1.类
- 2.接口
- 3.参数类型
- 4.方法返回值
- 作用
1.可以在编译期间检查错误 2.降低运行时产生 ClassCastException 异常的概率(如:动态自定义泛型转换) 3.实现声明类型限制,使代码更加 规范、易读、健壮 - 注意:
运行时就不会产生 ClassCastException异常,这句话并不准确 请看 4.参数指明泛型中的异常
2.类 泛型
- 类中的泛型,可以只有1个,可以存在多个(用逗号分隔)
- 自定义的任意字母都可以,T只是一个代号(表示Type的意思)
3.参数与返回值 泛型
- 根据参数类型传递的泛型,返回对应类型的返回值
- 注意:如果方法内部无法处理类型转换,仍然会出现 ClassCastException异常
4.父子类 泛型
- 对于父类中存在泛型,子类继承父类
- 已知:父类
class Father <T,M>{} ,则存在以下四种情况
class son1<T, M> extends Father<T, M> {
}
class son2_1<T,Integer> extends Father<T,Integer> {
}
class son2_2<T> extends Father<T,Integer> {
}
class son3<A, B> extends Father<A,B> {
}
class son4<T, M> extends Father<T, M> {
}
5.接口与实现 泛型
- 对于接口中存在泛型,实现类应满足如下情况
- 已知:接口
interface TestInterFace<T, M> { ,则存在以下四种情况
package com.abl.javabasis._08_generics;
public interface TestInterFace<T, M> {
}
class Impl_1<T, M> implements TestInterFace<T, M> {
}
class Impl_2_1<T, Integer> implements TestInterFace<T, Integer> {
}
class Impl_2_2<T> implements TestInterFace<T, Integer> {
}
class Impl_3<A, B> implements TestInterFace<A, B> {
}
class Impl_4<T, M> implements TestInterFace<T, M> {
}
6.通配符(?、extends、super)
如下方代码所示:
- 通配符的限制
- <? > : 没有任何类型限制,任意对象都可
- <? extends Number> : 继承,限制为 Number或Number的子类(接口和实现类也是这个关系)
- <? super Number> : 向上,限制为 Number或Number的父类
如下方代码所示:
- 1.不能用在泛型方法声明上,返回值类型前面<>不能使用?
- 2.不能用在泛型类的声明上
- 3.不能用在创建对象上,右边属于创建集合对象
package com.abl.javabasis._08_generics;
import java.util.HashSet;
public class TestWildcard {
void ltClass(HashSet<? extends Number> param) {
}
void gtClass(HashSet<? super Number> param) {
}
void objClass(HashSet<?> p) {
}
}
7.注意
- 1.可以声明多个泛型,多个泛型用逗号分隔
class Test1 <Object,T,A> { } - 2.泛型对构造器没有影响,只是类声明处加尖括号
- 3.泛型不相同的两个对象(引用),不能相互赋值
- 4.自定义泛型,默认继承 object 但是不等于 Object
- 5.不可以使用基本数据类型,但是可以使用包装类型
- 6.简化操作=号右边,new后面的泛型声明可以忽略
ArrayList<String> strList = new ArrayList<>(); - 7.类上的泛型,不能使用在静态变量和静态方法中
(错误示范 )
《上一篇:Object对象》
《下一篇:Java异常处理》
《目录:Java基础》
《幕》
- 留白 —<老吉>
- ~ 今 ~ ? ~ ?????????? ?????????? ???????
|