java——泛型

文章目录

  • Java 泛型
    • 泛型方法
      • 实例
    • 有界的类型参数:
      • 实例
    • 泛型类
      • 实例
    • 类型通配符
      • 1、类型通配符一般是使用?代替具体的类型参数。例如 List<?> 在逻辑上是List,List 等所有List<具体类型实参>的父类。
        • 实例
      • 2、类型通配符上限通过形如List来定义,如此定义就是通配符泛型值接受Number及其下层子类类型。
        • 实例
      • 3、类型通配符下限通过形如 List<? super Number>来定义,表示类型只能接受Number及其三层父类类型,如 Object 类型的实例。

Java 泛型

泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

假定我们有这样一个需求:写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序,该如何实现?
答案是可以使用 Java 泛型。
使用 Java 泛型的概念,我们可以写一个泛型方法来对一个对象数组排序。然后,调用该泛型方法来对整型数组、浮点数数组、字符串数组等进行排序。

泛型方法

你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
下面是定义泛型方法的规则:

  • 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的<E><E><E>)。
  • 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
  • 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
  • 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。

实例

下面的例子演示了如何使用泛型方法打印不同类型的数组元素:

public class GenericMethodTest
{// 泛型方法 printArray                         public static < E > void printArray( E[] inputArray ){// 输出数组元素            for ( E element : inputArray ){        System.out.printf( "%s ", element );}System.out.println();}public static void main( String args[] ){// 创建不同类型数组: Integer, Double 和 CharacterInteger[] intArray = { 1, 2, 3, 4, 5 };Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };System.out.println( "整型数组元素为:" );printArray( intArray  ); // 传递一个整型数组System.out.println( "\n双精度型数组元素为:" );printArray( doubleArray ); // 传递一个双精度型数组System.out.println( "\n字符型数组元素为:" );printArray( charArray ); // 传递一个字符型数组} 
}

编译以上代码,运行结果如下所示:
整型数组元素为:
1 2 3 4 5
双精度型数组元素为:
1.1 2.2 3.3 4.4
字符型数组元素为:
H E L L O

有界的类型参数:

可能有时候,你会想限制那些被允许传递到一个类型参数的类型种类范围。例如,一个操作数字的方法可能只希望接受Number或者Number子类的实例。这就是有界类型参数的目的。
要声明一个有界的类型参数,首先列出类型参数的名称,后跟extends关键字,最后紧跟它的上界。

实例

下面的例子演示了"extends"如何使用在一般意义上的意思"extends"(类)或者"implements"(接口)。该例子中的泛型方法返回三个可比较对象的最大值。

public class MaximumTest
{// 比较三个值并返回最大值public static <T extends Comparable<T>> T maximum(T x, T y, T z){                     T max = x; // 假设x是初始最大值if ( y.compareTo( max ) > 0 ){max = y; //y 更大}if ( z.compareTo( max ) > 0 ){max = z; // 现在 z 更大           }return max; // 返回最大对象}public static void main( String args[] ){System.out.printf( "%d, %d 和 %d 中最大的数为 %d\n\n",3, 4, 5, maximum( 3, 4, 5 ) );System.out.printf( "%.1f, %.1f 和 %.1f 中最大的数为 %.1f\n\n",6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );System.out.printf( "%s, %s 和 %s 中最大的数为 %s\n","pear","apple", "orange", maximum( "pear", "apple", "orange" ) );}
}

编译以上代码,运行结果如下所示:
3, 4 和 5 中最大的数为 5

6.6, 8.8 和 7.7 中最大的数为 8.8

pear, apple 和 orange 中最大的数为 pear

泛型类

泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。

和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。

实例

如下实例演示了我们如何定义一个泛型类:

public class Box<T> {private T t;public void add(T t) {this.t = t;}public T get() {return t;}public static void main(String[] args) {Box<Integer> integerBox = new Box<Integer>();Box<String> stringBox = new Box<String>();integerBox.add(new Integer(10));stringBox.add(new String("菜鸟教程"));System.out.printf("整型值为 :%d\n\n", integerBox.get());System.out.printf("字符串为 :%s\n", stringBox.get());}
}

编译以上代码,运行结果如下所示:
整型值为 :10

字符串为 :菜鸟教程

类型通配符

1、类型通配符一般是使用?代替具体的类型参数。例如 List<?> 在逻辑上是List,List 等所有List<具体类型实参>的父类。

实例

import java.util.*;public class GenericTest {public static void main(String[] args) {List<String> name = new ArrayList<String>();List<Integer> age = new ArrayList<Integer>();List<Number> number = new ArrayList<Number>();name.add("icon");age.add(18);number.add(314);getData(name);getData(age);getData(number);}public static void getData(List<?> data) {System.out.println("data :" + data.get(0));}
}

输出结果为:

data :icon
data :18
data :314
解析: 因为getData()方法的参数是List类型的,所以name,age,number都可以作为这个方法的实参,这就是通配符的作用

2、类型通配符上限通过形如List来定义,如此定义就是通配符泛型值接受Number及其下层子类类型。

实例

import java.util.*;public class GenericTest {public static void main(String[] args) {List<String> name = new ArrayList<String>();List<Integer> age = new ArrayList<Integer>();List<Number> number = new ArrayList<Number>();name.add("icon");age.add(18);number.add(314);//getUperNumber(name);//1getUperNumber(age);//2getUperNumber(number);//3}public static void getData(List<?> data) {System.out.println("data :" + data.get(0));}public static void getUperNumber(List<? extends Number> data) {System.out.println("data :" + data.get(0));}
}

输出结果:

data :18
data :314
解析: 在(//1)处会出现错误,因为getUperNumber()方法中的参数已经限定了参数泛型上限为Number,所以泛型为String是不在这个范围之内,所以会报错

3、类型通配符下限通过形如 List<? super Number>来定义,表示类型只能接受Number及其三层父类类型,如 Object 类型的实例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dotnet core基于ML.net的销售数据预测实践

ML.net已经进到了1.5版本。作为Microsoft官方的机器学习模型&#xff0c;你不打算用用&#xff1f;一、前言ML.net可以让我们很容易地在各种应用场景中将机器学习加入到应用程序中。这是这个框架很重要的一点。通过ML.net&#xff0c;我们可以使用手中的可用数据&#xff0c;进…

Java中关于省略作用域报错问题分析

这个是很典型的作用域问题&#xff0c;if后如果省略那么if只作用于其后面的第一行代码 这时候如果这行代码只是个变量声明语句的话&#xff0c;这个变量是没有其他任何逻辑可以访问到的&#xff0c;因为作用域问题(如果有/&#xff0c;那么声明语句中声明的变量只在这个个内可用…

java进阶之注解篇

文章目录注解基本语法定义注解元注解编写注解处理器注解元素默认值限制生成外部文件替代方案注解不支持继承实现处理器注解 注解&#xff08;也被称为元数据&#xff09;为我们在代码中添加信息提供了一种形式化的方式&#xff0c;使我们可以在稍后的某个时刻更容易的使用这些…

C#9就这么来了,.NET开发者该做点什么?

就在上周三10号&#xff0c;.NET5.0发布了第5个预览版&#xff0c;同时支持了C#9-preview&#xff01;是的&#xff0c;你没看错&#xff0c;虽然C# 8.0还未正式发布&#xff0c;但是通往C&#xff03;9的漫长道路却已经开始&#xff0c;这发展速度简直了&#xff01;C#语言的快…

C++,Java编程空指针的一个小细节

//判断是否击中了敌人坦克if (hero.shot!null && hero.shot.isLive ){for (int i 0;i<enemyTanks.size();i){EnemyTank enemyTank enemyTanks.get(i);hitTank(hero.shot,enemyTank);}}上面代码的if条件不能写成这样&#xff1a; if ( hero.shot.isLive &&am…

Magicodes.IE在.NET Core中通过请求头导出多种格式文件

原文作者&#xff1a;HueiFeng前言在2.2里程碑中我们增加了一些新的功能,正如标题所写通过请求头进行导出我们不同格式的文件.下面我们来看一下如何使用.通过这种方式无论是对我们的数据多用途&#xff0c;还是说对我们的数据校验都做到了轻松易配。同时我们也将在本周发布2.3版…

使用DQL查询数据

文章目录DQL语言SELECT语法制定查询字段AS 子句作为别名DISTINCT关键字的使用使用表达式的列where条件语句逻辑操作符模糊查询 &#xff1a; 比较操作符连接查询JION自连接排序和分页子查询DQL语言 DQL( Data Query Language 数据查询语言 ) 查询数据库数据 , 如SELECT语句简…

基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(九)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

关于-32768补码的问题

首先要知道的是计算机中补码的表示是唯一且连续的&#xff01;我想这是计算机为什么不用原码来表示的一个原因&#xff01;另外&#xff0c;以补码形式来运算的话&#xff0c;设计的逻辑电路会简单很多&#xff0c;会少很多逻辑运算器件&#xff0c;所以计算机采用补码的形式来…

TCP(发消息:简易代码实现)

文章目录客户端服务器review&#xff1a;查询IP和端口发送文件客户端 链接服务器Socket发送消息 package com.ayv.try02;import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket;//客户端 public class TcoClientDe…

记实现TDengine时序数据库支持 .Net Windows 32位系统踩坑

TDengine是一个高效的存储、查询、分析时序大数据的平台&#xff0c;专为物联网、车联网、工业互联网、运维监测等优化而设计的数据库&#xff0c; 官方目前没有提供完整的.Net Core 解决方案&#xff0c; 因此闲来无事&#xff0c; 从基于restful api 到现在使用官方编译的动态…

SPDY, WebSocket, WebDAV概念

SPDY&#xff08;读作“SPeeDY”&#xff09;是Google开发的基于TCP的应用层协议&#xff0c;用以最小化网络延迟&#xff0c;提升网络速度&#xff0c;优化用户的网络使用体验。SPDY并不是一种用于替代HTTP的协议&#xff0c;而是对HTTP协议的增强。新协议的功能包括数据流的多…

UDP(发短信:简单模拟)

发短信&#xff1a;不用连接&#xff0c;需要知道对方地址 文章目录UDP发送消息实现互相聊天UDP多线程实现聊天UDP发送消息 UDP传输 我们要用UDP传输数据时&#xff0c;怎么用Socket建立连接呢&#xff1f; DatagramSocket与DatagramPacket 建立发送端&#xff0c;接收端。 建…

SilkierQuartz 1.0.21 发布, 是一个 Quartz.NET 的强大且简单的Web管理工具和承载组件...

SilkierQuartz 是一个新的合并了 Quartzmin 和 QuartzHostedService的组件!Quartz.NET 是一个完整的开源的任务规划系统&#xff0c;从小应用至大型企业级应用都可以适用.Quartzmin Quartzmin 是一个 Quartz.NET 的强大且简单的Web管理工具QuartzHostedService QuartzHostedSer…

超文本运输协议HTTP概念

超文本传输协议&#xff08;HTTP&#xff0c;HyperTextTransfer Protocol)是互联网上应用最为广泛的一种网络传输协议&#xff0c;所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 1960年美国人Ted Nelson构思了一种通过计算机处…

多线程(简单实现)

继承Thread类 两条线程交替进行创建线程方式一&#xff1a;继承Theard类&#xff0c;重写run方法&#xff0c;调用start开启线程总结:注意&#xff0c;线程开启不一定立即执行&#xff0c;由CPU调度执行 //两条线程交替进行//创建线程方式一&#xff1a;继承Theard类&#xf…

用C#在STM32上写第一个Hello world

随着微软放弃.Net MF ,通过C#编写STM32 平台上的程序变得渺茫&#xff0c; 但是&#xff0c; 别着急&#xff0c; 目前至少有两个社区在做这件事情&#xff0c; 传承了微软的.Net MF , 一家是 nanoframework,另外一家比较封闭的是 GHI Electronics 地址是: https://github.com/…

如何找到Eclipse左侧项目栏

如何找到Eclipse左侧项目栏 window --> Show View --> other --> Java–> package Explorer

静态代理模式(多线程底部原理)

静态代理模式总结(线程底部原理) 真实对象和代理对象都要实现同一个接口代理对象要代理真实角色好处&#xff1a; - 代理对象可以做很多真实对象做不了的事情 - 真实对象专注做自己的事情创建静态代理模式&#xff1a;一个接口&#xff08;当前创建为函数式接口&#xff08;只…

深入async/await知多少

.net的async/await功能相信对很多人来说并不陌生了&#xff0c;有人感觉这功能很好&#xff0c;但也有人说这功能不好容易产生一些莫名其妙的死锁&#xff1b;有人说这些异步功能也有人说这是同步功能。其实在使用async/await的有多少人真的了解它们呢&#xff1f;接下来详细地…