目录
泛型
泛型的本质是参数化类型
,即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了。这种参数类型可以用在类、接口和方法中,分别被称为泛型类
、
泛型接口
、
泛型方法。
ArrayList<String> stringvalue=new ArrayList<String>();
参数化类型
1.1、泛型类
泛型类就是把泛型定义在类上。
定义格式:
public class ClassName<T>{
}
定义泛型类,在类名后添加一对尖括号,并在尖括号中填写类型参数,参数可以有多个,多个参数使用
逗号分隔。
例如: public class GenericClass<ab,a,c> {}
当然,这个后面的参数类型也是有规范的,不能像上面一样随意,通常类型参数我们都使用大写的单个
字母表示:
public class 类名 <T,...> {
}T:任意类型 type
E:集合中元素的类型 element
K:key-value形式 key
V:key-value形式 value
使用泛型类
:
类名称
<
数据类型
>
对象名称
=
new
类名称
<
数据类型
>
();
注意事项:
1.
泛型类型必须是引用类型(非基本数据类型)
2.
使用泛型的时候,前后定义的泛型类型必须保持一致,否则会出现编译异常
1.2、泛型方法
泛型方法,是在调用方法的时候指明泛型的具体类型 。
定义格式
:
public <T>T method Tt
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
与泛型类类似,只是方法声明中定义的形参只能在该方法里使用,而接口、类声明中定义的类型形参则 可以在整个接口、类中使用。若类和方法使用同一个标记符,则方法的标记符会覆盖类的标记符。
使用泛型方法
:在调用泛型方法的时候,可以指定泛型,也可以不指定泛型。
在不指定泛型的情况下,泛型变量的类型为 该方法中的几种类型的同一个父类的最小级,直到
Object。
在指定泛型的时候,该方法中的几种类型必须是该泛型实例类型或者其子类。
//
调用格式
<
指定的类型
>
泛型方法
(
实参列表
);
为什么使用泛型
1.
保证了类型的安全性
2.
消除强制转换
3.
避免了不必要的装箱、拆箱操作,提高程序的性能
4.
提高了代码的重用性
3、泛型通配符
Java
泛型的通配符是用于解决泛型之间引用传递问题的特殊语法
,
主要有以下三类
:
// 1
:表示类型参数可以是任何类型
public class
Apple
<?>
{}
// 2
:表示类型参数必须是
A
或者是
A
的子类
public class
Apple
<
T
extends
A
>
{}
// 3:
表示类型参数必须是
A
或者是
A
的超类型
public class
Apple
<
T supers A
>
{}