集合-Generic

2024-08-26 13:08
文章标签 集合 generic

本文主要是介绍集合-Generic,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当集合中存储的数据类型不同时,可能会导致程序运行的时候转型异常。

2、	package CollectionDemo;
3、	
4、	import java.util.ArrayList;
5、	import java.util.Iterator;
6、	import java.util.List;
7、	
8、	public class Demo {
9、	
10、			public static void main(String[] args) {
11、				List<Integer> list=new ArrayList<Integer>();
12、				list.add(1);
13、				list.add(2);
14、				list.add(3);
15、				//编译时报错
16、				//list.add("adf");
17、				System.out.println(list);
18、				Iterator<Integer> it=list.iterator();
19、				while(it.hasNext())
20、				{
21、					System.out.println(it.next());
22、				}
23、			}
24、	}

当加上对类型的限制以后,将运行时的异常提前至编译时发生。获取元素的时候无需强转类型,就避免了类型转换的异常问题。

当类中操作的引用数据类型不确定的时候,就可以使用泛型类。注:<>中的数据类型必须是引用类型。

泛型

泛型方法

           当写一个函数,调用者传递什么类型的变量,该函数就返回什么类型的变量的时候,因为无法确定传递什么类型的数据,如果不用泛型的话,方法的形参就定义为Object类型,返回值也就是Object类型,但是使用该函数时需要强制类型转换。但是强制类型转换如果每次都判断是什么类型的,然后转换的话执行效率很低,否则可能因为类型不一致而报类型转换异常。所以此时,可以考虑泛型方法。

泛型就是将类型当做变量处理,规范泛型的定义一般是一个大写的任意字母。

函数上的泛型定义方法

         public<泛型的声明> 返回值类型函数名(泛型变量名){}

package CollectionDemo;import java.util.ArrayList;
import java.util.List;public class Demo {public static void main(String[] args) {List<Integer> list=new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);System.out.println(new Demo().getData(list));}public <T> T getData(T data){return data;}
}

注:使用泛型方法前需要进行泛型声明,该声明位置在static后,返回值类型前。

泛型类

         当一个类中有多个函数声明了泛型,那么该泛型的生命可以声明在类上。

格式:

         修饰符 class 类名<泛型>{}

       

package CollectionDemo;
import java.util.ArrayList;
import java.util.List;public class Demo<T> {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);System.out.println(new Demo().getData(list));}public T getData(T data) {return data;}
}

注:静态方法不可以使用类中定义的泛型

因为类中的泛型需要在对象初始化时指定具体的类型,而静态优先于对象存在,那么类中的静态方法就需要单独进行泛型声明。

package CollectionDemo;import java.util.ArrayList;
import java.util.List;public class Demo<T> {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);System.out.println(Demo.getData2(list));}public  T getData(T data) {return data;}public static<E> E  getData2(E data){return data;}
}

继承泛型类的写法

class Parent<T>
{public T getData(T t){return t;}
}
//父类指定了具体的类型,则子类不用再指定类型
class Child extends Parent<String>
{
}
//当父类使用了泛型,则子类也需要使用泛型
class Child<T> extends Parent<T>
{
}
//错误写法,当父类上定义了泛型,则子类上也需要定义,这里子类没有定义,所以编译出错
class Child extends Parent<T>
{
}

泛型接口

interface Parent<T>{
}//父类定义了明确的类型时
class Child implements Parent<String>{
}//实现不知为何种类型时可以这样定义
class Child2<T> implements Parent<T>{
}

泛型通配符

package CollectionDemo;import java.util.ArrayList;
import java.util.Collection;
import java.util.List;public class Demo {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);//下面这行代码编译不通过new Demo().getData(list);}public  void getData(Collection<Object> data) {System.out.println(data);}
}

看上面的代码,getData中对集合限定了为Object类型,而list为Integer类型,所以编译不通过。此时可以通过将List<Integer> list = new ArrayList<Integer>();中的<Integer>去掉,或者将

getData(Collection<Object> data)改为getData(Objectdata),当然,也可以使用泛型通配符来解决。

将getData(Collection<Object> data)改为getData(Collection<?>data)

可以对类型进行限定范围

? extends E :接收E类型或者E类型的子类型

? super E :接收E类型或者E的福类型

接收Number类型或者Number的子类型

正确: List<? extends Number> x=new List<Integer>();

错误: List<? extends Number> x=newList<String>();

接收Integer或者Integer的父类型

正确:List<? super Integer> x=new List<Number>();

错误:List<? super Integer> x=newList<Byte>();

注:通过泛型,可以将原来程序运行时可能发生的问题,转变为编译时的问题,提高了程序的可读性和稳定性。泛型是提供给编译器使用的,用于限定集合的输入类型,让代码在编译过程中就把错误暴露出来。当编译器编译完带有泛型的程序后,生成的class文件中将不再带有泛型信息,来使程序运行效率不受影响,这个过程称为“擦除”。

这篇关于集合-Generic的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

Java基础回顾系列-第六天-Java集合

Java基础回顾系列-第六天-Java集合 集合概述数组的弊端集合框架的优点Java集合关系图集合框架体系图java.util.Collection接口 List集合java.util.List接口java.util.ArrayListjava.util.LinkedListjava.util.Vector Set集合java.util.Set接口java.util.HashSetjava

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

java集合的概述

集合就是一个容器,我们可以把多个对象放入的容器中。就像水杯(假设容量可以不断扩大)一样,你可以往水杯中不断地添加水,既然是水杯,你就不能往里添加沙子,也就是说集合中添加的对象必须是同一个类型的(引用类型,而不能是基本类型)。 看到集合的介绍会让我们的想起数组,那么集合和数组有什么区别呢? 首先,数组的大小是固定的,而集合理论上大小是不限的。 其次,数组既可以存储基本数据类型的数据,也可以存储

hutool 集合相关交集、差集

开发过程中会遇到集合之间的对比之类的需求,之前经常会自己写个工具类来实现,目前hutool可以帮助我们解决很多问题,接下来我们就来实践下。 相关jar包 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>RELEASE</version><scope>compile</sco

Java8中的Stream,让集合操作酸爽起来

简介 java8也出来好久了,接口默认方法,lambda表达式,函数式接口,Date API等特性还是有必要去了解一下。比如在项目中经常用到集合,遍历集合可以试下lambda表达式,经常还要对集合进行过滤和排序,Stream就派上用场了。用习惯了,不得不说真的很好用。 Stream作为java8的新特性,基于lambda表达式,是对集合对象功能的增强,它专注于对集合对象进行各种高效、便利的聚合

算法练习小技巧之有序集合--套路详细解析带例题(leetcode)

前言:         本文详细讲解Python中的有序集合SortedList和C++中的有序集合multiset的用法,配合leetcode的例题来展示实际的用处。(本人水平不够,还无法讲解有序集合的实现方法,只会用)         觉得有帮助或者写的不错可以点个赞,后面也有几道我找出来的题目可以用这个方法快速解决的         (感觉有点水) 目录 有序集合用法讲解:

Java中集合类Set、List和Map的区别

Java中的集合包括三大类,它们是Set、List和Map,它们都处于java.util包中,Set、List和Map都是接口,它们有各自的实现类。Set的实现类主要有HashSet和TreeSet,List的实现类主要有ArrayList,Map的实现类主要有HashMap和TreeMap。那么它们有什么区别呢? Set中的对象不按特定方式排序,并且没有重复对象。但它的有些实现类能对集合中的对

复杂SQL集合(不断收集中)

1.一道SQL语句面试题,关于group by 表内容: 2005-05-09 胜 2005-05-09 胜 2005-05-09 负 2005-05-09 负 2005-05-10 胜 2005-05-10 负 2005-05-10 负 如果要生成下列结果, 该如何写sql语句?             胜 负 2005-05-09 2 2 2005-05-10 1 2 --------

EL表达式获取List集合长度

有一次在jsp页面我要获取后台的一个list集合的长度,当然你可以在后台保存长度然后在页面获取,这是一种方法,现在我介绍另一种方法: 首先:我们在jsp页面导入jstl标签库<%@ taglib prefix="fn" uri="http://java.sun.com/jsp.jstl/functions"%> 然后在你要获取的地方写上:${fn:length(qunarRemarkList)