java泛型2,通配符?专辑(以及泛型其他特性)

2024-04-09 05:48

本文主要是介绍java泛型2,通配符?专辑(以及泛型其他特性),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.很重要的概念:?是实际参数,不是形式参数。
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<T>{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<Object> l_obj = new ArrayList<>();
List<String> l_str = new ArrayList<>();
//子类转父类
l_obj = l_str;//编译出错,List<Object>并不是List<String>的父类

2.有这样一个泛型方法

public static void test(Object obj, Object[] a_obj, List<Object> 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<? extends Object>

调用,都没问题

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

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

<? extends Father>

表示Father类或所有Father类的子类
例,有如下方法:

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

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

2.通配符的下限

<? super Son>

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

六.java8的改进类型推断
这里写图片描述

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

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

这篇关于java泛型2,通配符?专辑(以及泛型其他特性)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/887320

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定