一、泛型的引入原因
在开发中往往会出现一下代码:
public class Demo {
public static void main(String[] args) {
List list=new ArrayList();
list.add("zyxwmj.top");
//list.add(new Demo());
String str=null;
for(Object s:list){
str=(String) s;
}
System.out.println(str);
}
}
在上面代码集合的存储类型是 Object 类型,向集合中添加对象时,都是自动向上转型,可以加入任何类型的元素。但是,在取出元素的时候,通常需要向下转型,此时就可能出现类型转换异常。
在 JDK1.5 时候提出一个解决方案:泛型,暂时先不追究它内在是怎么实现的,只要知道使用泛型定义集合,我们就不需要强制类型转换,可以避免一些安全隐患。
二、泛型的定义
泛型的定义格式是用尖括号括起来的类型参数实现的,一般用 T 或 E 这样的单个大写字母来表示类型参数。当一个泛型有多个类型参数时,每个类型参数在该泛型中都应该是唯一的。如果不能定义为Zyx(T,T)形式的泛型,但可以定义为Zyx(T,E)形式的泛型
注意:泛型只能使用引用类型,不能使用基本类型。
1、泛型类或接口
泛型类或接口:表示该类或接口以后要操作的引用类型不确定,所以在定义的时候需要定义为泛型类或接口,在创建对象的时候,指定具体要操作的类型。
泛型类的定义
[修饰符] class 类名<T>
泛型接口的定义
[修饰符] interface 接口名<T>
泛型类的使用
public class Zyx<T> {
private T a;
public T getA() {
return a;
}
public void setA(T a) {
this.a = a;
}
public static void main(String[] args) {
Zyx<String> name=new Zyx<String>();
Zyx<Integer> age=new Zyx<Integer>();
name.setA("zyxwmj.top");
age.setA(18);
System.out.println(name.getA());
System.out.println(age.getA());
}
}
2、泛型方法
表示该方法以后要操作的引用类型不确定,所以在定义的时候定义为泛型方法。定义与其所在的类或接口是否为泛型类或接口没有关系。要定义泛型方法,只需要将泛型的类型参数
泛型方法的定义
[修饰符] <T> 返回值类型 方法名(T 参数,参数列表)
泛型方法的应用
public class Zyx{
public static <T> void zyx(T a){
System.out.println(a.getClass());
System.out.println(a);
}
public static void main(String[] args) {
Zyx.zyx("zyxwmj.top");
Zyx.zyx(2);
}
}
三、泛型的高级应用
1.泛型通配符:?表示,通常用于操作任意参数类型的泛型。
2.泛型的界限:其目的是在一定范围内扩大可以操作的参数类型。分为上界限,和下界限。
泛型上界:表现形式:<? extends A> 表示的含义是:可以操作的参数类型可以是,A 类型以及 A 的子类。通常这种在集合中取出元素的时候常常使用,通常用 A 类型来接收取出的元素。
泛型下界:表现形式:<? super A> 表示的含义是:可以操作的参数类型是:A 类型及其父类型,泛型下限的使用不多。
标题:Java中泛型的应用
作者:Yi-Xing
地址:http://47.94.239.232:10014/articles/2019/10/24/1571882926981.html
博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!