泛型规范在JDK1.5版本中被添加,使用泛型机制编写的代码比起随意使用Object变量然后再进行强制类型转换的代码具有更高的安全性和可读性,同时也更为简洁。泛型对于集合类尤其有用,例如 ArrayListarray = new ArrayList();。

一、泛型

泛型程序设计(Generic programming)意味着编写的代码可以被很多操作不同数据类型的对象所重用。例如

ArrayListarray=newArrayList();

简单声明一个ArrayList类型的集合,集合中维护了一个Object引用的数组。而实际使用中集合往往只需要维护某一种特定的非Obj数据类型并对其进行操作,这意味着这ArrayList集合将面对两个问题:1.对集合中元素进行操作时必须进行强制类型转换。2.可以向集合中添加任意类型的变量,如果对任意类型变量进行操作时(比如强制类型转换),容易产生运行时错误。

泛型提供了一个很好的解决方案:类型参数(type parameters)。比如ArrayList类这样来指定类型参数:

ArrayListarray=newArrayList();

这样生命的ArrayList集合只能接收 String 类型的变量,存储其他类型变量时会在编译时报错。同时不需要进行强制类型转换。

例如这段代码将所有元素转换成大写:

public class Demo1 {

public static void main(String[] args) {

ArrayList list = new ArrayList(); // 表示该容器只能存储String类型的数据。

list.add("aa");

list.add("bb");

list.add("cc");

list.add(123); //会编译时报错

for(int i = 0 ; i < list.size() ; i++){

String str = list.get(i);

System.out.println("大写:"+ str.toUpperCase());

}

}

}

二、自定义泛型

1.在方法上自定义泛型

自定义泛型:自定义泛型就是一个数据类型的占位符或者是一个数据类型的变量。

方法上自定义泛型的声明格式:(与变量一样需要先声明,再使用)

修饰符 返回值类型 函数名(使用自定义泛型 …){函数体}

public class Demo {

public static void main(String[] args){

String str = getData("abc");

}

public static E getData(E o){ //是声明自定义的泛型 E是返回值类型为E 形参中的E是指传入参数的类型

return o;

}

}

在方法上自定义泛型需要注意的问题:

1.在泛型中不能使用基本数据类型,如果需要使用基本数据类型,那么就使用基本数据类型对应的包装类型。

byte —-> Byte

short —-> Short

int —-> Integer

long —-> Long

double —-> Double

float —-> Float

boolean—-> Boolean

char —-> Character

在方法上自定义泛型,这个自定义泛型的具体数据类型是在调用该方法的时候传入实参时确定具体的数据类型的。

自定义泛型只要符合标识符的命名规则即可, 但是自定义泛型我们一般都习惯使用一个大写字母表示。 T (Type) E (Element).

2.在类上自定义泛型

泛型类的定义格式:

class 类名{类体}

泛型类在类的声明部分引入类型变量,声明的类型变量可以在整个类中使用。(在类中自定义泛型之后便无需在每个方法中定义)同时泛型类也可以声明多个类型变量,例如

public class Pair{}

用具体的类型替换类型变量就可以实例化泛型类,例如:

Pair;

以及文章开头的

ArrayListarray=newArrayList();

实例:重写一个数组类,实现元素翻转

class MyArrays{

public void reverse(T[] arr){ //元素翻转

for(int startIndex = 0, endIndex = arr.length-1 ; startIndex

T temp = arr[startIndex];

arr[startIndex] = arr[endIndex];

arr[endIndex] = temp;

}

}

public String toString(T[] arr){ //重写toString方法

StringBuilder sb = new StringBuilder();

for(int i = 0 ; i < arr.length ; i++){

if(i==0){

sb.append("["+arr[i]+",");

}else if(i==arr.length-1){

sb.append(arr[i]+"]");

}else{

sb.append(arr[i]+",");

}

}

return sb.toString();

}

public static void print(T[] t){

}

}

public class Demo2 {

public static void main(String[] args){

Integer[] arr = {10,12,14,19};

MyArrays tool = new MyArrays(); //使用泛型定义的类既可以对Integer类型进行操作,同时也可以对String数据类型进行操作,提高了复用性

tool.reverse(arr);

System.out.println("数组的元素:"+tool.toString(arr));

MyArrays tool2 = new MyArrays();

String[] arr2 = {"aaa","bbb","ccc"};

tool2.reverse(arr2);

ArrayList list = new ArrayList();

}

}

泛型类要注意的事项:

在类上自定义泛型的具体数据类型是在使用该类的时候创建对象时候确定的。

如果一个类在类上已经声明了自定义泛型,如果使用该类创建对象的时候没有指定泛型的具体数据类型,那么默认为Object类型。

在类上自定义泛型不能作用于静态的方法,如果静态的方法需要使用自定义泛型,那么需要在方法上自己声明使用。

3.在接口上定义泛型

泛型接口的定义格式:

interface 接口名{类体}

泛型接口要注意的事项:

接口上自定义的泛型的具体数据类型是在实现一个接口的时候指定的。

在接口上自定义的泛型如果在实现接口的时候没有指定具体的数据类型,那么默认为Object类型。

3.延长接口自定义泛型的具体数据类型,那么格式如下:(实现一个接口的时候,还不明确我目前要操作的数据类型,需要等待创建接口实现类的对象的时候才能指定泛型的具体数据类型)

格式: public class Demoimplements Dao{ } //在接口名以及类名之后都要声明自定义泛型

示例代码:

interface Dao{

public void add(T t);

}

public class Demo implements Dao{

public static void main(String[] args){

Demo d = new Demo();

}

public void add(T t){

}

}

三、泛型的上下限

泛型中通配符: ?

使用格式:

? super Integer : 只能存储Integer或者是Integer父类元素。 泛型的下限

? extends Number : 只能存储Number或者是Number类型的子类数据。 泛型的上限

示例代码:

public class Demo5 {

public static void main(String[] args) {

ArrayList list1 = new ArrayList();

ArrayList list2 = new ArrayList();

HashSet set = new HashSet();

//getData(set);

}

//泛型的上限

//定义一个函数可以接收接收任意类型的集合对象, 要求接收的集合对象只能存储Number或者是Number的子类类型数据。

public static void getData(Collection extends Number> c){

}

//泛型的下限

//定义一个函数可以接收接收任意类型的集合对象, 要求接收的集合对象只能存储Integer或者是Integer的父类类型数据。

public static void print(Collection super Integer> c){

}

}

java基本数据类型泛型_Java中的泛型相关推荐

  1. java中什么泛型_Java中的泛型

    1.为什么要使用泛型? (1)适用于多种数据类型执行相同的代码,利于封装(如,封装Base类.统一的适用于recycleview的adapter等) (2)泛型中的类型在使用的时候,直接指定即可,不需 ...

  2. java中什么泛型_java中的泛型(一)

    在java中我们定义接口其实定义的是这个类的功能,在很多时候我们并不关心这个类的类型而是这个类的能力.泛型的出现让我们的代码和代码所能操作的类型不在绑定在一起,不仅可以复用代码降低耦合还可以提高代码的 ...

  3. java浮点型数据类型分为_java中的浮点型数据类型有哪几种

    java中的浮点型数据类型有哪几种 发布时间:2020-06-23 14:14:45 来源:亿速云 阅读:67 作者:元一 这篇文章将为大家详细讲解有关java中的浮点型数据类型,文章内容质量较高,因 ...

  4. java 泛型机制_java中的泛型机制

    泛型 这种语法机制,只在程序编译阶段起作用,只是给编译器参考的.(运行阶段泛型没用) 使用了泛型好处是什么? 第一:集合中存储的元素类型统一. 第二:从集合中取出的元素类型是泛型指定的类型,不需要进行 ...

  5. java中什么时候不能用泛型_java中泛型的正确使用姿势

    image.png 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.利用好泛型,在系统架构中是一把利器. 泛型类 先看一个例子,restful架构中,需要定义api接口返回 ...

  6. java 类 方法 带泛型_java中的泛型类和泛型方法

    1.泛型是什么? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类. 可以在集合框架(Collection fram ...

  7. .net java 泛型_Java高级特性泛型看这一篇就够了

    作者:qwer1030274531 出自:ITPUB博客 1.为什么我们需要泛型? 通过两段代码就可以知道为什么需要泛型 /*** * 没有泛型的时候实现加法 */public class NonGe ...

  8. java参数传入泛型类型_Java 5.0 泛型之 使用泛型统一传入的参数类型

    Java 5.0 泛型之 使用泛型统一传入的参数类型 package Demo; // 使用泛型统一传入的参数类型 class Info28 { private T var; // 此类型由外部决定 ...

  9. java 枚举与泛型_Java枚举和泛型

    这件事让我困扰了一段时间.以前我曾问过 questions,可能是一个不好的措辞和一个太抽象的例子.所以不清楚我实际在问什么.我会再尝试.请不要跳过结论.我期待这个问题根本不容易回答! 为什么我不能在 ...

最新文章

  1. Android 开发者必知的开发资源
  2. 范凯:一个二次创业者的失败
  3. python调用c++传递数组
  4. 川大计算机文化基础在线作业,川大1309《计算机文化基础0008》在线作业2答案.docx...
  5. 计算机启动硬盘响,电脑开机时硬盘响个不停是什么原因?原因分析与解决方法介绍...
  6. iPhone 14不会全部采用挖孔屏 仅两款Pro版采用
  7. myeclipse里使用fat jar生成可执行jar
  8. linux ssh 中文变问号,乱码 解决
  9. OpenSSH私钥BEGIN OPENSSH PRIVATE KEY与BEGIN RSA PRIVATE KEY格式转换方式
  10. 使用环绕通知对目标方法进行增强—摘抄笔记
  11. 再读王垠的《编程的智慧》,有怎样的感想?
  12. frontend -- 框架
  13. Maven之快速入门
  14. 华东理工《文献检索》MOOC (3)---精通web of science检索结果分析、JCR数据库检索
  15. Google之Stopwatch 计时器
  16. 里氏代换原则C#详解
  17. SAP成都研究院的体育故事
  18. 解决安卓手机点击有效,苹果手机点击事件无效的问题
  19. 混合云风头正劲 青云QingCloud为何成为领导者?
  20. 中创易票通打印票据支票 v2.3 bt

热门文章

  1. C#实现万年历(农历、节气、节日、星座、星宿、属相、生肖、闰年月、时辰)
  2. .net平台调用(P/Invoking)查询网站
  3. 创建一个单选框的html代码是,HTML试题(超有用).doc
  4. 如何用自己的笔记本电脑使用学校机房的千兆校园网
  5. Andorid audio设备名和音频基本概念
  6. 统计学常见分布、概念
  7. Android Binder机制:编写自己的本地服务
  8. C++之=deleted
  9. VALSE学习(十):图像去模糊-image deblurring
  10. WordPress如何开启用户注册功能