java新特性—泛型

Java中的泛型新特性 Java的泛型提供了类型安全性和代码重用的好处。在Java 7和Java 8中引入的钻石操作符和泛型实例化类型推断使泛型代码更简洁。泛型方法可以在方法声明中定义泛型类型,并且可以独立于类的泛型参数。通过合理应用泛型的新特性,我们可以编写更加安全和灵活的代码。泛型是Java语言中的一个重要特性,它允许我们在编译时期指定类、接口和方法的参数类型。Java的泛型提供了类型安全性和代码重用的好处。在最新的Java版本中,泛型得到了一些新的改进和扩展。,它可以接受任意类型的数组作为参数,并打印数组中的每个元素。 阅读详情

泛型genericity

泛型就是指类中的属性的类型在实例化对象的时候通过外部进行了指定。

class 类名称<泛型类型,泛型类型,…>{
}

一个泛型的小程序。

package org.study.RobertChao;

public class Info<T>{
    private T x;//x属性的类型由外部决定
    private T y;//y属性的类型由外部决定
    public T getX(){
        return x;
    }
    public void setX(T x){
        this.x = x;
    }
    public T getY(){
        return y;
    }
    public void setY(T y){
        this.y = y;
    }
}

声明一个具有封装性的类,其中的属性的类型由外部决定,属于泛型。

package org.study.RobertChao;

public class GenDemo00{
    public static void main(String[] args){
        Info<Integer> i= new Info<Integer>();
        i.setX(11);
        i.setY(20);
        int x = i.getX();//取出x
        int y = i.getY();//取出y
        System.out.println("x是:"+ x);
        System.out.println("y是:"+ y);
    }
}

在设置X、Y的参数类型的时候,要求与实例化对象的类型一致。

package org.study.RobertChao;

public class GenDemo01{
public static void main(String[] args){
    Info<Integer> i= new Info<Integer>();
    i.setX(11);//正确,与<T>的类型要保持一致。
    i.setY("二十");//错误,不能设置String类型。
    int x =i.getX();//取出x。
    int y =i.getY();//取出y。
    System.out.println("x是:"+x);
    System.out.println("y是:"+y);
    }
}

1、在构造方法上引用泛型。

package org.study.RobertChao;

public class Info<T>{
    private T x;//x属性的类型由外部决定
    private T y;//y属性的类型由外部决定

    public Info(T x, T y){
        this.setX(x);
        this.setY(y);
    }//在构造方法中使用泛型,写在参数的构造器中作为参数。

    public T getX(){
        return x;
    }
    public void setX(T x){
        this.x = x;
    }
    public T getY(){
        return y;
    }
    public void setY(T y){
        this.y = y;
    }
}
package org.study.RobertChao;

public class GenDemo02 {
    public static void main(String[] args) {
    Info<Integer> i= new Info<Integer>(10, 20);
    //在调用的时候需要使用构造方法设置内容。
    //设置的内容本身依然由泛型指定。
    int x = i.getX();//取出x
    int y = i.getY();//取出y
    System.out.println("x是:"+x);
    System.out.println("y是:"+y);
    }
}

通过上述的结论可以知道:

  • 类型名称<类型> 变量名称=new 类型名称<类型>(符合构造器的内容)
  • 无参构造器Info<Integer> i=new Info<Integer>();
  • 有参数的构造器Info<Integer> i=new Info<Integer>(10, 20);

2、擦除泛型。

擦出泛型:使用的时候没有指定泛型的话。

  • 泛型擦除之后,将按照Object进行接收,以保证程序不出现任何的错误。

  • Infop = new Info(10, 20);

  • 使用泛型的样式是:
    • Info<Integer> i=new Info<Integer>(10, 20);

3、通配符。

  • "?"
    • “?”表示的是可以接收任意的泛型类型。
    • 只是接收输出,并不能修改。
package org.study.RobertChao;

public class GenDemo03{
    public static void main(String[] args) {
        Info<Object> i1 = new Info<Object>();
        Info<Integer> i2 = new Info<Integer>();
        fun(i1) ;
        fun(i2) ;
    }
    public static void fun(Info<?> in){
    //表示,此时可以接收任意的类型
        System.out.println(in.getX());
        System.out.println(in.getY());
    }
}
  • 泛型上限extends

    • 语法:"? extends 父类"

    • 所包含的最大的内容就是父类的内容。

    • 父类是Number,能够接收到的类型是Number及其子类Integer、etc..

    • 泛型的上限也可以在方法上使用,例如:接受参数。

package org.study.RobertChao;

public class GenDemoup04 {
    public static void main(String[] args) {
        Info<Integer> in= new Info<Integer>();
        fun(in);
    }
    public static void fun((Point<? extends Number> in)){
    //表示,此时可以接收任意的类型
        System.out.println(in.getX());
        System.out.println(in.getY());
    }
}
  • 泛型下限super

    • 语法:"? super 父类"

    - 只能设置其具体的类或者父类。

    • 泛型的下限也可以在方法上使用,例如:接受参数。
package org.study.RobertChao;

public class GenDemodown04 {
    public static void main(String[] args) {
        Info<Integer> in= new Info<Integer>();
        fun(in);
    }
    public static void fun((Point<? super Number>po)){
    //表示,此时可以接收任意的类型
        System.out.println(in.getX());
        System.out.println(in.getY());
    }
}

4、泛型接口

  • 公式 interface 接口名称<泛型类型,泛型类型,…>{}

泛型接口的定义:

package org.study.RobertChao;

public interface Demo<T>{//定义泛型接口
    public void print(T param);//此抽象方法中使用了泛型类型
}

泛型接口定义完成,后需要定义子类实现此接口。

实现的方法有两种:

  • The first.

  • GenDemo05继承了Demo,通过实例化的时候分配的类型决定。

package org.study.RobertChao;

public class GenDemo05<T> implements Demo<T> {
    public void print(T param){
        System.out.println("param = "+param);
    }
}
package org.study.RobertChao;

public class GenDemo06{
    public static void main(String[] args) {
        Demo<String> demo = new GenDemo05<String>() ;
        demo.print("hello") ;
    }
}
  • The Second.

  • 这种方法在类中,一早就输入了合适的类型。

package org.study.RobertChao;

public class GenDemo07 implements Demo<GenDemo07>{
//设置具体类型
    public void print(GenDemo07 param){
        System.out.println("param = "+param);
    }
}
package org.study.RobertChao;

public class GenDemo08{
    public static void main(String[] args) {
        Demo<GenDemo07> demo = new GenDemo07() ;
        demo.print(new GenDemo07()) ;
    }
}

5、泛型方法

  • 泛型除了在类中,还可以在方法上使用泛型。
  • 此方法所在的类不一定是泛型的操作类。
package org.study.RobertChao;
public class Demo09{
    public <T> T print(T param){//定义泛型方法
    //第一个 <T> 表示该方法是泛型方法。
    //第二个  T  表示返回值类型是T类型。
        return param;
    }
}
  • Demo类中的print()方法里面接收泛型的类型,而且此方法的返回值也是指定的泛型类型。

可以将方法的返回值定义成一个泛型的数组。

package org.study.RobertChao;
    public class GenDemo10{
        public static void main(String[] args){
            Integer i[] = fun(1, 2, 3, 4, 5, 6, 7, 8, 9);
            for (int x : i){
                System.out.println(x);
            }
        }
        public static <T> T[] fun(T... param){
            return param; // 返回数组
        }
}

6、泛型嵌套
|- 用一个例子来说明嵌套,(容器里边存放容器)

// 泛型类Info<K,V>  
class Info<K,V>{  
    private K key;  
    private V value;  

   // 构造函数  
    public Info(K key, V val){  
        this.key = key;  
       this.value = val;     
    }     

    // 设置key  
    public void setKey(K k){  
        this.key = k;     
    }  

   // 设置value  
    public void setValue(V v){  
      this.value = v;   
    }  

    // 获取KEY  
    public K getKey(){  
     return this.key;    
    }  

    // 获取value  
    public V getValue(){  
        return this.value;        
    }  

    // 覆写toString()方法  
    public String toString(){  
        return "Key:"+this.key+", Value:"+this.value;  
   }  
}  

// Demo<S>中的S在这代表Info<K,V>,实现泛型嵌套  
class Demo<S>{  
    // 泛型S的对象  
    private S info;  

    // Demo构造函数  
    public Demo(S info) {  
        this.info = info;     
    }  

   // 设置S类型的info  
    public void setInfo(S info){  
        this.info = info;     
    }  

    // 获取info  
    public S getInfo(){  
        return this.info;     
    }  
}  
// main  
public class GenericEmbeded{  
   public static void main(String args[]){  

        // 实例化Info类对象  
       Info<String,Integer> info = new Info<String, Integer>("石家庄",1);  
        // 实例化Demo类对象,泛型嵌套 
       Demo<Info<String,Integer>> d = new Demo< Info<String,Integer>>(info);  
        // 获取Info<K,V>对象后,再调用toString()方法,最后输出.  
        System.out.print(d.getInfo());                      
    }     
}  
3、Java语言新特性与泛型编程深度解析 本文深入解析了Java语言的新特性,包括可变参数、装箱/拆箱、类型安全的枚举、静态导入和元数据等,同时详细介绍了泛型编程的基础知识、泛型类与泛型方法的定义和使用,以及增强的for循环语法和Java类库的相关更新。通过这些内容,帮助开发者更好地理解和应用Java新特性,提高编程效率和代码质量。 阅读详情

相关推荐

SAP MM新手避坑指南:工厂间调拨用301还是303?手把手教你选对移动类型

本文深入解析SAP MM模块中工厂间调拨的301与303移动类型,帮助新手避开常见陷阱。通过对比一步法(301)和两步法(303+305)的核心差异、适用场景及财务影响,提供清晰的决策框架和实战技巧,确保库存调拨的准确性和效率。

weixin_29223603的博客 346

Genericity - 泛型 - Java - 细节狂魔

文章目录前言什么是泛型?引出泛型代码示例结论由结论 引出 我们的泛型,将存在缺陷弥补。泛型初步结论:语法语法一语法二泛型类的使用语法类型推导(Type inference)裸类型(Raw Type)前半部分的概括小结泛型是如何编译的?擦除机制擦除机制的介绍泛型的上界语法示例实例复杂示例 - 比较接口实例 - 写一个泛型类,找出数组中的最大值泛型方法定义语法实例 - 非静态实例 - 静态泛型中的父子类关系通配符 前言 对于泛型,我们的学习目的:看得懂就可以了。因为 泛型是 java 当中比较难的一块语法了

DarkAndGrey的博客 2404

达梦的自定义类型和存储过程支持创建同义词,不支持同义词使用?

达梦8的自定义类型和存储过程支持创建同义词,但是通过同义词调用报错,而在oracle上验证没有问题,难道是发现了达梦的bug了?非也非也,详情请见下文

wy071218的专栏 979

Java 新特性之泛型,kafka的架构图

public void test2(){ // 如果没有,那么就表示ArrayList中变量类型是 Object 类型的。 ArrayList list = new ArrayList<>(); list.add(78); list.add(87); list.add(99); list.add(65); Iterator iterator = list.iterator(); while(iterator.hasNext()){ int stuScore = iterator.next();

m0_63175850的博客 187

【open judge】【程设】魔兽世界三开战!

#程设 魔兽世界三---开战!--------原以为会很容易ac,没想到写了好久,看来自己的水平还是亟待提高啊!有几个比较有趣的点:1. typeid(#include&lt;typeinfo&gt;)还是比较好用的,特别是本题当战士为wolf,iceman, dragon, ninja时有特殊技能,那么用typeid判断一下就很方便了。2. 对于这种输出很复杂的问题,往往通过使用文件的输入输出再...

weixin_40841416的博客 6073

【第六届起重机创意大赛国一作品——资料分享】

文章目录前言一、比赛内容分析二、确定方案与作品模型1.方案简图2.作品模型三、电控部分控制思路单片机选择与资源分配拓展板的设计接线与走线代码分享总结

qq_19308801的博客 7781

Java Genericity

四、 Java Genericity 1. Genericity 泛型 泛型 <T> 1. 泛型就是参数化类型 2. 作用:安全,方便 3. 适用于对多种数据类型执行相同功能的代码,主要适用于集合 4. 泛型中的类型在使用时指定,不能是基本数据类型5. 不能在静态方法和静态属性中使用所在类的泛型 6. 通常用单个大写字母表示,尽可能见名知意(T T...

dianxun5648的博客 211

Rocky Linux 9 远程桌面配置全攻略:从零搭建XRDP服务(含防火墙设置)

本文提供了在Rocky Linux 9上从零开始配置XRDP远程桌面服务的完整指南。详细介绍了系统准备、XRDP服务安装、防火墙与SELinux安全设置、多用户性能优化以及多平台客户端连接实测。重点解决了使用Windows远程桌面协议(RDP)连接Rocky Linux时常见的配置难点与安全问题,帮助用户获得稳定高效的图形化远程访问体验。

vodka的博客 646

Java新特性-泛型

1.JDK1.5新特性 1.1可变参数 问:要求方法可以接收任意个整数并且返回它们的相加结果。 要求:一个方法只允许有一个可变参数,并且只允许写在最后。 语法:类型…参数名称。 可变参数的本质还是数组。 1.2for-each循环 for(数据类型 临时变量 : 数组名称){} 用于数组与类集的简单输出。 1.3静态导入: 不同包中,在a包中调用b包的类中的静态属性,可以在b包中用static导...

hgelin的博客 435

WIFI CSI动作识别数据集全解析:从数据采集到深度学习应用

本文全面解析了利用商用Wi-Fi设备的信道状态信息进行动作识别的完整流程。文章以经典WiSA数据集为例,深入剖析了CSI数据的采集原理、结构特点,并详细阐述了从原始数据预处理、特征工程到深度学习模型(如CNN-LSTM融合架构)构建与优化的关键技术,旨在为研究者提供从数据到应用的全链路实战指南。

r2s3t4的博客 281

饥饿游戏搜索算法(HGS)详解:从生物激励到智能优化

饥饿游戏搜索算法(HGS)是一种受动物饥饿驱动觅食行为启发的智能优化算法。该算法通过模拟生物饥饿程度与觅食策略的关系,将个体适应度映射为饥饿感,并据此动态调整搜索行为。HGS的核心机制包括:1) 饥饿权重计算(W1/W2),2) 三种位置更新策略(随机探索、正向/负向协作),3) 自适应平衡参数E。算法通过迭代优化逐步改进解的质量,具有参数自适应、全局搜索能力强等特点,在复杂优化问题中表现出色。相比传统优化方法,HGS更注重个体内部状态对搜索行为的影响,实现了探索与开发的自然平衡。

qq_42212808的博客 155

JAVA学习笔记37——泛型3:泛型嵌套+泛型数组+1.7新特性

最近在看JAVA教学的视频,觉得老师讲的很好,同时借用源代码还有笔记来撰写本系列博客,记录自己的学习内容,同时也供看到的人学习。 本篇将剩下的三点介绍完。 NO.4:泛型的嵌套: 示例代码: public class Bjsxt { T stu ; public static void main(String[] args) { //泛型的嵌套 Bjsxt> room

向计算机殿堂奔跑的跑道 931

线性自抗扰控制(LADRC)系统算法框图

NLADRC自抗扰控制从Simulink仿真到PLC控制实现_自抗扰控制器 simulink仿真-优快云博客本文介绍了如何将ADRC自抗扰控制算法从Simulink仿真应用到PLC控制中,包括Simulink框图、TD微分器模型、MATLAB函数的使用、SCL控制代码,以及非线性状态误差反馈控制率的实现。提供了详细的MATLAB仿真步骤和PLC源代码链接。ADRC自抗扰控制算法(含梯形图完整源代码和算法公式)_adrc算法-优快云博客。

RXXW_Dor的博客 1463

Java基础-序列化、泛型、1.8新特性、其他

Java基础-序列化、泛型、1.8新特性、其他

m0_50846237的博客 1294

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

java新特性之泛型

一、java新特性(JDK1.5) 1.可变参数: public [static][final]返回值 方法名称([参数类型 参数名称][参数类型…参数名称]){} 如:对于任意参数的整数相加 public static int add(int...data) //可变参数,“...”表示一个数组结构 { int result=0; for(int i...

qq_41889292的博客 238

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java基础18--泛型--工具类--JDK1.5新特性

18-1,泛型-概述 1,泛型是JDK1.5出现的新技术,新技术的出现是为了解决问题。 2,泛型可以用于明确一个集合中存储什么类型的元素 ArrayList<String> al = new ArrayList<String>(); al.add("abc");//正确 //al.add(3);//编译直接报错 //在迭代器上加上泛型,下面取出来的时候就不用强转了 Iterator<String> it = al.iterator(); while(it.hasNext()) { //在这里不用强转了,因

您已进入防沉迷系统... 2265

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java 新特性之泛型

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考以下是部分内容截图《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**如果你觉得这些内容对你有帮助,可以扫码获取!!

2301_76238237的博客 785

JAVA8新特性--lambda表达式结合泛型的简单应用

JAVA8新特性–lambda表达式结合泛型的简单应用 本篇文章将介绍小编对java8新特性–lambda表达式的理解,以及java5后引入的泛型的理解。随后介绍将lambda表达式结合泛型的实践。 lambda表达式 小编查阅了很多博客,总结一下: 1、lambda表达式最初java并不会支持,其实现形式与C++的指针相似; 2、java8之前的版本采用匿名内部类来代替lambda表达式; 知识...

m0_43514502的博客 5696

java-day16-vector、LinkedList、泛型、JDK5的新特性

目录Vector特有功能LinkedList特有功能自定义栈集合泛型定义泛型类泛型方法泛型接口泛型高级JDK5的新特性增强for静态导入可变参数举例 Vector 特有功能 // 添加功能 public void addElement(Object obj) // --add // 获取功能 public Object elementAt(int index) // --get public Enumeration elements() // --Iterator boolean hasMoreEl

Field_ctxy的博客 375

java类型参数推断_Java8新特性之泛型的目标类型推断

原标题:Java8新特性之泛型的目标类型推断Java8新特性之泛型的目标类型推断简单理解泛型泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。通俗点将就是“类型的变量”。这种类型变量可以用在类、接口和方法的创建中。理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作:List box = n...

weixin_39864591的博客 136
上一篇: JAVA-面向对象
下一篇: Java 新特性—枚举
Roobert_Chao
博客等级 码龄9年 89粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值