博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
泛型复习
阅读量:6717 次
发布时间:2019-06-25

本文共 4163 字,大约阅读时间需要 13 分钟。

回顾泛型类

泛型类:具有一个或多个泛型变量的类被称之为泛型类

1、class A<T>{
}

2、在创建泛型实例时,需要为其类型变量赋值

A<String> a=new A<String>();
*如果创建实例时,不给类型变量赋值,那么会有一个警告!

3、泛型方法:具有一个或多个类型变量的方法,称之为泛型方法!

class A<T>{
public T fun(T t1){}
}
fun()方法不是泛型方法!它是泛型类中的一个方法!
public <T> T fun(T t1){} -->它是泛型方法
*泛型方法和泛型类没有什么关系,泛型方法不一定非要在泛型类中!

4、泛型在类中或者方法中的使用

*泛型类中使用泛型:
>成员类型
>返回值类型和参数类型
>局部变量的引用上
class A<T>{
private T bean;//泛型可在成员变量上使用
public T fun(T t){}//泛型可以在类中的方法上(返回值和参数类型)使用!
public void fun2(){//泛型还可以在局部变量的引用类型上使用
T b=...
new T();//不行的
}
}
=====================================
5、泛型的继承和实现
class A<T>{}
class AA extends A<String>{} //不是泛型类,只是它爸爸是泛型类!
5.1 继承泛型类
*子类不是泛型类:需要给父类传递类型常量
>当给父类性传递的类型常量为String时,那么在父类中所有T都会被String替换
*子类是泛型类:可以给父类传递类型常量,也可以传递泛型变量
class AA1 extends A<Integer>{}
class AA3<E1> extends A<E1>(){}

============================================

泛型的通配符
1、通配符的使用场景
方法的形参!
2、通配符的优点
使方法更加通用!
3、通配符分类
无界通配 ?
子类限定:? extends Object
父类限定:? super Integer
4、通配符缺点
使变量使用上不再方便
无界:参数和返回值为泛型的方法不能使用
子类:参数为泛型的方法不能使用
父类:返回值为泛型的方法不能使用
5、比较通配符
boolean addAll(Collection<E> c)

List<Number> numList=new ArrayList<Number>();

List<Integer> intList=new ArrayList<Integer>();
numList.add(intList);//编译失败

boolean addAll(Collection<? extends E> c)

List<Number> numList=new ArrayList<Number>();

List<Integer> intList=new ArrayList<Integer>();
numList.add(intList);

 

package cn.itcast;import org.junit.Test;public class Demo1 {    @Test    public void fun1(){        AA3
aa3=new AA3
(); }}class A
{ private T t; public T fun1(){ return t; } public void fun2(T t){ this.t=t; } }class AA1 extends A
{ }class AA2 extends A
{ }class AA3
extends A
(){}package cn.itcast;import java.util.ArrayList;import java.util.List;import org.junit.Test;public class Demo2 { @Test public void fun1(){ Object[] objs=new Object[10]; List list=new ArrayList(); String[] strs=new String[10]; List
strList=new ArrayList
(); Object[] objArray=new String[10]; objArray[0]=new Integer(100);//java.lang.ArrayStoreException: java.lang.Integer// List
objList=new ArrayList
(); /* * 泛型引用和创建两端,给出的泛型变量必须相同! */ } public void fun2(){ List
integerList=new ArrayList
(); print(integerList);//List
list=new ArrayList
(); List
strList=new ArrayList
(); print(strList); } /* * 这个?就是通配符 * 通配符只能出现在左边!,即不能再new时使用通配符!!! * List
list=new ArrayList
(); */ /* * ?它表示一个不确定的类型,它的值会在调用时调用下来 */ public void print(List
list){ /* * 当使用通配符,对泛型类中参数为泛型的方法起到了副作用 */ //list.add("hello"); /* * 当使用通配符时,泛型类中返回值为泛型的方法也作废了 */ Object s=list.get(0); /* * 通配符的好处:可以使泛型类型更加通用!尤其是在方法调用时形参使用通配符 */ } public void fun3(){ List
intList=new ArrayList
(); print1(intList); List
lonList=new ArrayList
(); print1(lonList); // List
strList=new ArrayList
();// print1(strList); } /* * 给通配符添加了限定 * 只能传递Number或其子类 * 子类统配对通用性产生了影响,但使用形参更加灵活 */ public void print1(List
list){ /* * 参数为泛型的方法还是不能使用 */// list.add(new Integer(100)); /* * 返回值为泛型的方法可用 */ Number number=list.get(0); } public void fun4(){ List
intList=new ArrayList
(); print2(intList); // List
lonList=new ArrayList
();// print2(lonList); List
objList=new ArrayList(); print2(objList); } /* * 给通配符添加了限定 * 只能传递Integer类型,或其父类型 */ public void print2(List
list){ /* * 参数为泛型的方法可以使用了 */ list.add(new Integer(100));// Integer int1=list.get(0); /* * 返回值为泛型的方法,还是不能使用 */ Object obj=list.get(0); } }

 

反射获取类上面的泛型信息:

package cn.itcast.demo1;import java.lang.reflect.ParameterizedType;import org.junit.Test;public class Demo1 {    @Test    public void fun1(){        new C();    }    }class A
{ public A(){ /* * 在这里获取子类传递的泛型信息 */// Type type=this.getClass().getGenericSuperclass();//获取父类的参数化类型 格式为A
或。。。// ParameterizedType pType=(ParameterizedType) type;// Class c=(Class) pType.getActualTypeArguments()[0];//参数的Class数组 Class c=(Class)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]; System.out.println(c.getName()); }}class B extends A
{ }class C extends A
{ }
View Code

 

转载地址:http://drkmo.baihongyu.com/

你可能感兴趣的文章
python paramiko 执行命令
查看>>
centos7安装
查看>>
docker强制删除none的image镜像
查看>>
JavaScript学习
查看>>
Linux下通用二进制安装包安装MySQL-5.6.37
查看>>
简单跳板机的搭建笔记
查看>>
Verizon宣布2018年将部署全国性NB-IoT网络
查看>>
python 十六进制转换十进制(MAC 转换 IP 地址)
查看>>
opensips使用加密密码认证
查看>>
静态元素过期时间
查看>>
php 解决乱码问题
查看>>
Ubuntu安装Mcafee步骤
查看>>
FTP服务器搭建下的主动模式和被动模式
查看>>
owncloud在CentOS上详细部署
查看>>
MyEclipse 代码运行生产的key
查看>>
Ubuntu下彻底删除vim
查看>>
HTML页面静态化实现
查看>>
关于selenium中断言判断url获取错误解决
查看>>
mysql的排障之二
查看>>
oracle 恢复学习 案例1 一个数据文件丢失 完全恢复数据库
查看>>