iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java中泛型的示例详解
  • 850
分享到

Java中泛型的示例详解

Java泛型机制Java泛型 2022-11-13 18:11:44 850人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录泛型概述使用泛型的好处泛型的定义与使用定义和使用含有泛型的类含有泛型的方法含有泛型的接口泛型通配符通配符基本使用通配符高级使用----受限泛型泛型概述 我们都知道集合中是可以存放

泛型概述

我们都知道集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。 大家观察下面代码:

public class GenericDemo {
	public static void main(String[] args) {
		Collection coll = new ArrayList();
		coll.add("hello");
		coll.add("zjq");
		coll.add(5);//由于集合没有做任何限定,任何类型都可以给其中存放
		Iterator it = coll.iterator();
		while(it.hasNext()){
			//需要打印每个字符串的长度,就要把迭代出来的对象转成String类型
			String str = (String) it.next();
			System.out.println(str.length());
		}
	}
}

程序在运行时发生了问题java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String。

为什么会发生类型转换异常呢?                                                                                                                             

我们来分析下:由于集合中什么类型的元素都可以存储。导致取出时强转引发运行时ClassCastException。            

怎么来解决这个问题呢?                                                                                                                                       

Collection虽然可以存储各种对象,但实际上通常Collection只存储同一类型对象。例如都是存储字符串对象。因此在jdk5之后,新增了泛型(Generic)语法,让你在设计api时可以指定类或方法支持泛型,这样我们使用API的时候也变得更为简洁,并得到了编译时期的语法检查。

泛型:可以在类或方法中预支地使用未知的类型。

tips:一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。

使用泛型的好处

那么泛型带来了哪些好处呢?

  • 将运行时期的ClassCastException,转移到了编译时期变成了编译失败。
  • 避免了类型强转的麻烦。

通过我们如下代码体验一下:

public class GenericDemo2 {
	public static void main(String[] args) {
        Collection<String> list = new ArrayList<String>();
		coll.add("hello");
		coll.add("zjq");
        // list.add(5);//当集合明确类型后,存放类型不一致就会编译报错
        // 集合已经明确具体存放的元素类型,那么在使用迭代器的时候,迭代器也同样会知道具体遍历元素类型
        Iterator<String> it = list.iterator();
        while(it.hasNext()){
            String str = it.next();
            //当使用Iterator<String>控制元素类型后,就不需要强转了。获取到的元素直接就是String类型
            System.out.println(str.length());
        }
	}
}

tips:泛型是数据类型的一部分,我们将类名与泛型合并一起看做数据类型。

泛型的定义与使用

我们在集合中会大量使用到泛型,用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递。

定义和使用含有泛型的类

定义格式:

修饰符 class 类名<代表泛型的变量> {  }

例如,API中的ArrayList集合:

class ArrayList<E>{ 
    public boolean add(E e){ }

    public E get(int index){ }
   	....
}

使用泛型: 即什么时候确定泛型。

在创建对象的时候确定泛型

例如,ArrayList<String> list = new ArrayList<String>();

此时,变量E的值就是String类型,那么我们的类型就可以理解为:

class ArrayList<String>{ 
     public boolean add(String e){ }

     public String get(int index){  }
     ...
}

再例如,ArrayList<Integer> list = new ArrayList<Integer>();

此时,变量E的值就是Integer类型,那么我们的类型就可以理解为:

class ArrayList<Integer> { 
     public boolean add(Integer e) { }

     public Integer get(int index) {  }
     ...
}

举例自定义泛型类

public class MyGenericClass<MVP> {
	//没有MVP类型,在这里代表 未知的一种数据类型 未来传递什么就是什么类型
	private MVP mvp;
     
    public void setMVP(MVP mvp) {
        this.mvp = mvp;
    }
     
    public MVP getMVP() {
        return mvp;
    }
}

使用:

public class GenericClassDemo {
  	public static void main(String[] args) {		 
         // 创建一个泛型为String的类
         MyGenericClass<String> my = new MyGenericClass<String>();    	
         // 调用setMVP
         my.setMVP("大胡子登登");
         // 调用getMVP
         String mvp = my.getMVP();
         System.out.println(mvp);
         //创建一个泛型为Integer的类
         MyGenericClass<Integer> my2 = new MyGenericClass<Integer>(); 
         my2.setMVP(123);   	  
         Integer mvp2 = my2.getMVP();
    }
}

含有泛型的方法

定义格式:

修饰符 <代表泛型的变量> 返回值类型 方法名(参数){  }

例如,

public class MyGenericMethod {	  
    public <MVP> void show(MVP mvp) {
    	System.out.println(mvp.getClass());
    }
    
    public <MVP> MVP show2(MVP mvp) {	
    	return mvp;
    }
}

使用格式:调用方法时,确定泛型的类型

public class GenericMethodDemo {
    public static void main(String[] args) {
        // 创建对象
        MyGenericMethod mm = new MyGenericMethod();
        // 演示看方法提示
        mm.show("aaa");
        mm.show(123);
        mm.show(12.45);
    }
}

含有泛型的接口

定义格式:

修饰符 interface接口名<代表泛型的变量> {  }

例如:

public interface MyGenericInterface<E>{
	public abstract void add(E e);
	
	public abstract E getE();  
}

使用格式:

1.定义类时确定泛型的类型

例如:

public class MyImp1 implements MyGenericInterface<String> {
	@Override
    public void add(String e) {
        // 省略...
    }

	@Override
	public String getE() {
		return null;
	}
}

此时,泛型E的值就是String类型。

2.始终不确定泛型的类型,直到创建对象时,确定泛型的类型

例如:

public class MyImp2<E> implements MyGenericInterface<E> {
	@Override
	public void add(E e) {
       	 // 省略...
	}

	@Override
	public E getE() {
		return null;
	}
}

确定泛型:


public class GenericInterface {
    public static void main(String[] args) {
        MyImp2<String>  my = new MyImp2<String>();  
        my.add("aa");
    }
}

泛型通配符

当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。

通配符基本使用

泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。 此时只能接受数据,不能往该集合中存储数据。

举个例子大家理解使用即可:

public static void main(String[] args) {
    Collection<Intger> list1 = new ArrayList<Integer>();
    getElement(list1);
    Collection<String> list2 = new ArrayList<String>();
    getElement(list2);
}
public static void getElement(Collection<?> coll){}
//?代表可以接收任意类型

tips:泛型不存在继承关系 Collection

通配符高级使用----受限泛型

之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛型的上限下限泛型的上限

  • 格式类型名称 <? extends 类 > 对象名称
  • 意义只能接收该类型及其子类

泛型的下限

  • 格式类型名称 <? super 类 > 对象名称
  • 意义只能接收该类型及其父类型

比如:现已知Object类,String 类,Number类,Integer类,其中Number是Integer的父类

public static void main(String[] args) {
    Collection<Integer> list1 = new ArrayList<Integer>();
    Collection<String> list2 = new ArrayList<String>();
    Collection<Number> list3 = new ArrayList<Number>();
    Collection<Object> list4 = new ArrayList<Object>();
    
    getElement(list1);
    getElement(list2);//报错
    getElement(list3);
    getElement(list4);//报错
  
    getElement2(list1);//报错
    getElement2(list2);//报错
    getElement2(list3);
    getElement2(list4);
  
}
// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}
// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection<? super Number> coll){}

以上就是Java中泛型的示例详解的详细内容,更多关于Java泛型的资料请关注编程网其它相关文章!

--结束END--

本文标题: Java中泛型的示例详解

本文链接: https://www.lsjlt.com/news/169602.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中泛型的示例详解
    目录泛型概述使用泛型的好处泛型的定义与使用定义和使用含有泛型的类含有泛型的方法含有泛型的接口泛型通配符通配符基本使用通配符高级使用----受限泛型泛型概述 我们都知道集合中是可以存放...
    99+
    2022-11-13
    Java泛型机制 Java泛型
  • Java泛型的类型擦除示例详解
    目录前言泛型的类型擦除原则是:1 擦除类定义中的类型参数1.1 无限制类型擦除1.2 有限制类型擦除2 擦除方法定义中的类型参数3 桥接方法和泛型的多态总结参考资料前言 Java泛型...
    99+
    2024-04-02
  • 详解Java中的泛型
    目录一.什么是泛型二.泛型类的使用2.1泛型类的定义2.2泛型类的数组使用三.泛型的上界四.泛型的方法五.泛型与集合一.什么是泛型 当我们不确定数据类型时,我们可以暂时使用一个字母 ...
    99+
    2023-05-19
    Java泛型 Java泛型类
  • java 泛型的详解及实例
    java 泛型的详解及实例Java在1.5版本中增加了泛型,在没有泛型之前,从集合中读取每一个对象都需要进行强转,如果一不小心插入了类型错误的对象,在运行时就会报错,给日常开发带来了很多不必要的麻烦,比如以下代码:public class ...
    99+
    2023-05-31
    java 泛型 ava
  • Java中泛型的示例分析
    小编给大家分享一下Java中泛型的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. 为什么使用泛型早期的Object类型可以接收任意的对象类型,但是在实...
    99+
    2023-06-20
  • Java中泛型使用实例详解
    Java中泛型使用泛型作用:泛型:集合类添加对象不用强转反射机制:将泛型固定的类的所有方法和成员全部显示出来 核心代码:ArrayList<Ls> ff=new ArrayList()<Ls>;Ls ls1...
    99+
    2023-05-31
    java 泛型 ava
  • Java 泛型详解与范例
    目录一、泛型的使用二、泛型类的定义-类型边界三、类型擦除四、泛型类的使用-通配符五、泛型方法六、泛型的限制一、泛型的使用 前面我们学集合的时候,简单的说过泛型的使用。如下: Ar...
    99+
    2024-04-02
  • Java 获取泛型的类型实例详解
    Java 获取泛型的类型实例详解Java 泛型实际上有很多缺陷,比如不能直接获取泛型的类型,不能获取带泛型类等。以下方式是不正确的:①.获取带泛型的类的类型Class lstUClazz = List<User>.class...
    99+
    2023-05-31
    java 泛型 类型
  • TypeScrip中泛型的案例详解
    泛型的定义 // 需求一: 泛型 可以支持不特定的数据类型, 要求,传入的参数和返回参数一致 // 这种方式虽然能实现传入和返回的参数一致,但是失去类型参数检验 // 定义...
    99+
    2024-04-02
  • C#泛型的使用及示例详解
    目录一、什么是泛型二、为什么使用泛型三、泛型类型参数四、泛型类五、泛型约束六、泛型的协变和逆变七、泛型缓存这篇文章主要讲解C#中的泛型,泛型在C#中有很重要的地位,尤其是在搭建项目框...
    99+
    2024-04-02
  • Java 泛型详解(超详细的java泛型方法解析)
    目录2. 什么是泛型3. 使用泛型的好处4. 泛型的使用4.1 泛型类4.2 泛型方法4.3 泛型接口5. 泛型通配符5.1 通配符基本使用5.2 通配符高级使用6. 总结1. 为什...
    99+
    2024-04-02
  • Java中泛型擦除的示例分析
    小编给大家分享一下Java中泛型擦除的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.问题引出源码: public static&n...
    99+
    2023-05-31
    java
  • 详解Java和Kotlin中的泛型
    详解Java和Kotlin中的泛型?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、泛型类型泛型允许你定义带类型形参的数据类型,当这种类型的实例被创建出来后,类型形参便被替换为...
    99+
    2023-06-15
  • java泛型中类型擦除的转换示例
    这篇文章给大家分享的是有关java泛型中类型擦除的转换示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用...
    99+
    2023-06-14
  • Spring实现泛型注入的示例详解
    目录1.Spring泛型注入2. 关于java泛型有四种TypeGenericArrayType泛型数组类型ParameterizedType参数化类型TypeVariable 类型...
    99+
    2024-04-02
  • Java泛型Generic机制实例详解
    目录泛型是什么?泛型类泛型方法类型变量的限制类型擦除通配符上界通配符下界通配符无界通配符反射和泛型类型字面量限制和局限性不能使用基本类型实例化类型参数运行时类型查询只适用于原始类型不...
    99+
    2022-11-13
    Java 泛型 Generic Java Generic
  • Kotlin泛型的型变之路演变示例详解
    目录引言协变协变的限制逆变逆变的限制Kotlin型变Kotlin泛型的优化申明处型变reified支持协变的List获取泛型的具体类型reified传入指定Class匿名内部类反射P...
    99+
    2022-12-21
    Kotlin 泛型型变 Kotlin 泛型
  • Java 泛型的上界和下界通配符示例详解
    目录介绍上界下界上下界通配符总结介绍 Java中的泛型是一种强类型的机制,允许我们在编译时检查类型的安全性,以避免在运行时出现类型转换异常。泛型的上界和下界用于限制泛型类型参数的范...
    99+
    2023-05-14
    Java 泛型的上界和下界 Java 泛型
  • Java泛型之类型擦除实例详解
    目录前言泛型是什么?泛型的定义和使用泛型类泛型方法泛型类与泛型方法的共存现象泛型接口通配符?无限定通配符<><extendsT>类型擦除类型擦除带来的局限性泛...
    99+
    2024-04-02
  • TypeScript泛型约束条件示例详解
    目录什么是泛型泛型的应用场景泛型约束(限制条件)泛型函数调用指定类型总结什么是泛型 两个值之间存在的对应关系,就可以用泛型来解决 泛型的应用场景 当一个函数的返回值的类型需要与此函数...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作