泛型是在编译阶段 限制 类型 就是为 泛型指定的类型
Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型是一种把类型的明确工作推迟到创建对象或者调用方法的时候才去明确的特殊类型。
注意:类型参数只能代表引用类型,不能是原始类型(像int,double,char等)。
泛型可以使用在方法、接口、类 分别称作为:泛型类、泛型方法、泛型接口。
泛型类定义的格式:
格式:修饰符 class 类名<类型>{ }
范例: public class Mayikt
此处T可以随便写为任意标识,T,E,K,V等形式的参数常用于表示泛型;
示例
public class Mayikt{
private T t;
/*
泛型类型格式:public class Mayikt{}
private T t;
也就是 在类中定义的成员属性 泛型 T 类型 与我们在类上定义泛型类型是相同的
*/
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
public static void main(String[] args) {
Mayikt t = new Mayikt<>();
t.setT("test");
System.out.println(t.getT());
Mayikt i = new Mayikt<>();
i.setT(521);
System.out.println(i.getT());
Mayikt d = new Mayikt<>();
d.setT(10.00);
System.out.println(d.getT());
}
}
___________________________________________________________________________________________________
test
521
10.0
进程已结束,退出代码0
格式:修饰符 <类型> 返回值类型 方法名(类型 变量名){ }
范例:public
public class Mayikt{
/*
格式:修饰符<类型> 返回值类型 方法名(类型 变量名){ }
范例:public void show(T t){ }
*/
public T show(T t){
return t;
}
public static void main(String[] args) {
Mayikt m = new Mayikt();
System.out.println(m.show("m"));
System.out.println(m.show(true));
System.out.println(m.show(10.10));
System.out.println(m.show(520));
}
}
____________________________________________________________________________________________________________
m
true
10.1
520
进程已结束,退出代码0
格式:修饰符 interface 接口名<类型>{ }
范例:public interface MayikeInterface
public interface MayikeInterface {
T show(T t);
}
//没有指定泛型实现接口实现方法为Object类
class MayiktImpl1 implements MayikeInterface{
@Override
public Object show(Object o) {
return null;
}
}
class MayiktImpl2 implements MayikeInterface{
@Override
public T show(T t) {
return t;
}
}
class MTest{
public static void main(String[] args) {
MayiktImpl2 test = new MayiktImpl2<>();
System.out.println(test.show("HYL"));
}
}
__________________________________________________________________________________________________________
HYL
利用泛型模仿ArrayList
public interface MayiktList{
void add(E e);
E get(int index);
}
class MayiktArrayList implements MayiktList{
@Override
public void add(E e) {
System.out.println("新增成功");
}
@Override
public E get(int index) {
System.out.println("查询成功");
E e = null;
return e;
}
}
class MTest{
public static void main(String[] args) {
MayiktList stringMayiktList = new MayiktArrayList<>();
stringMayiktList.add("HYL");
}
}
类型通配符> 一般用于接收使用,不能够做添加
List> :表示元素类型未知的 list,它的元素可以匹配任何类型
带通配符的List仅表示它是各种泛型List的父类,并不能把元素添加到其中。
类型通配符上限:List extends 类型> ——》List extends MayiktParent> :它表示的类型是MayiktParent或者子类型。
类型通配符下限:List super 类型> ——》List super MayiktParent> :它表示的类型是MayiktParent或者其父类类型。
public class Test01 {
/*
* 定义的printList方法 明确知道 接收具体list泛型 是什么类型
* List> 只能够用于接收 ?——————可以接收所有的泛型类型,但是不能用于添加
* 可以做get操作 获取到的类型为Object
*/
public static void printList(List> list){
//list.add("ss"); //用于添加会报错
//Object o = list.get(1);//用于接收get()方法的类型为Object
Iterator> iterator = list.iterator();
//遍历传过来的list
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
list.add("i:"+i);
}
printList(list);
}
}
____________________________________________________________________________________________________________
i:0
i:1
i:2
i:3
i:4
进程已结束,退出代码0
类型通配符上下限
public class Test01 {
public static void main(String[] args) {
ArrayList mayiktParents = new ArrayList<>();
ArrayList students = new ArrayList<>();
ArrayList
public class Test01 {
public static void main(String[] args) {
// 泛型原理 底层 使用擦除机制
// 泛型 是在编译阶段限制传递的类型
List strs = new ArrayList<>();
strs.add("HYL");//储存的是String类型
/*
说明: 将一个List集合赋值给一个没有使用到泛型的List集合
直接去除泛型————》擦除机制
*/
List list = strs;
list.add(123);//储存的是Objec类型
/*
泛型 是在编译阶段限制传递的类型 在运行阶段都是擦除的
class文件在运行 里面是没有 泛型
Java源代码——》编译成class文件 xjad工具用作反编译,将.class文件反编译成.java源代码
反编译成.java文件泛型会全部擦除,变成Objec类
*/
}
}