博客
关于我
java泛型2,通配符?专辑(以及泛型其他特性)
阅读量:187 次
发布时间:2019-02-28

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

一.很重要的概念:?是实际参数,不是形式参数。

1.?实际参数,也就是使用的时候传的参数,不是定义的时候使用的参数。?关键字不能用在泛型的类型定义上。

二.?详解

1.?是一个通配符,称为泛型通配符。
2.?代表未知的类型,也代表任何类型。

三.?泛型通配符的特性

1.?作为泛型类型的实际参数,代表这个泛型类型为未知类型。
2.?类型作为泛型类型实际参数,代表这个 泛型代表的类 的 类型为 未知类型。
3.?(未知类型)类型的类,只能取出这个类,并且只能用Object类型接收取出的类。
4.?(未知类型)类型的类,不能为这个类设置值,因为不知道这个类的类型,所以不能把任何一个类的对象赋值给它(大部分人的回答,能取不能设值 -_-! )

package test;public class Test1 {    public static void main(String[] args) {        Person
p = new Person(); p.setT(new Object());//此行代码编译出错 Object o = p.getT();//只能用Object类型接收 }}//普通泛型类class Person
{ private T t; public T getT() { return t; } public void setT(T t) { this.t = t; }}

四.使用场景(一般配合集合使用)

1.这时就要说到java继承的特性了。

1.普通类Object obj = new Object();String str = new String();//子类转父类obj = str;//没问题,Object为String的父类2.数组Object[] a_obj = {obj};String[] a_str = {str};//子类转父类a_obj = a_str;//没问题,Object[]为String[]的父类3.集合List l_obj = new ArrayList<>();List
l_str = new ArrayList<>();//子类转父类l_obj = l_str;//编译出错,List
并不是List
的父类

2.有这样一个泛型方法

public static void test(Object obj, Object[] a_obj, List l_obj){}

调用时,传形式参数类型的实际参数,没问题

test(obj, a_obj, l_obj);//没问题

调用时,传参时,实际参数类型 为 形式参数类型 的子类,没问题,java会自动子类转父类,List并不是List的子类,所以,编译报错

test(str, a_str, l_str);//前两个参数有父子关系,没问题。最后一个参数不是父子关系,报错!

4.这时就要使用到泛型通配符?类,改造方法

public static void test(Object obj, Object[] a_obj, List
l_obj){ //但是l_obj中的元素只能用Object接收}听说List
l_obj的默认上界是List

调用,都没问题

test(obj, a_obj, l_obj);//没问题test(str, a_str, l_str);//没问题

五.更深入些,通配符的上下界

1.通配符的上限

表示Father类或所有Father类的子类

例,有如下方法:

public void test(List
lists){ //无论传Father还是其子类,都不用强转(子类默认可以转父类) for(Father father:lists){ //此处仍然只能取元素,不能向lists添加元素 //TODO }}

特性:由于不知道受限制通配符?的具体子类型,所以无法将Father或其子类加入到泛型集合中。

2.通配符的下限

表示Son类或者所有Son类的父类

六.java8的改进类型推断

这里写图片描述

七.泛型的擦除和转换

1.使用泛型类时没指定泛型类型参数的值,默认为泛型类型的上界类型(没指定上界为Object)
2.当把一个具有泛型信息的对象赋予另一个没有指定泛型信息的对象时,泛型信息将会转为泛型类型的上界类型(没指定上界为Object)
3.这里写图片描述

八.泛型数组

1.经量不使用泛型数组,很容易引发ClassCaseException异常

你可能感兴趣的文章
Nginx配置代理解决本地html进行ajax请求接口跨域问题
查看>>
nginx配置全解
查看>>
Nginx配置参数中文说明
查看>>
Nginx配置后台网关映射路径
查看>>
nginx配置域名和ip同时访问、开放多端口
查看>>
Nginx配置多个不同端口服务共用80端口
查看>>
Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
查看>>
Nginx配置如何一键生成
查看>>
Nginx配置实例-动静分离实例:搭建静态资源服务器
查看>>
Nginx配置实例-反向代理实例:根据访问的路径跳转到不同端口的服务中
查看>>
Nginx配置实例-反向代理实现浏览器请求Nginx跳转到服务器某页面
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Nginx配置自带的stub状态实现活动监控指标
查看>>
nginx配置详解、端口重定向和504
查看>>
Nginx配置负载均衡到后台网关集群
查看>>
Nginx配置限流,技能拉满!
查看>>
Nginx配置静态代理/静态资源映射时root与alias的区别,带前缀映射用alias
查看>>
Nginx面试三连问:Nginx如何工作?负载均衡策略有哪些?如何限流?
查看>>
Nginx:NginxConfig可视化配置工具安装
查看>>