获取list泛型_泛型
泛型
什么是泛型?为什么使用泛型?
泛型的出现意味着编写的代码可以被不同类型的对象所重用,提升了代码的重用性。泛型的本质是参数化类型,即将所需操作的数据类型设置为一个参数。 举个实际中的栗子:我们需要设计一个柜子的类,柜子可以用于存放书本、食品或者衣物,但是我们在设计阶段不能确定柜子里具体要存放什么东西,那怎么来设计这样一个通用型的柜子,这里就可以用到泛型。所以,我们把存放元素的类型设计成一个参数,这个类型参数就称之为泛型。 举个JAVA中的栗子:ArrayList,List,这个就是类型参数,也就是泛型。为什么这么写呢?因为我们在创建Arraylist或者List时,无法确定里面具体存储的元素的类型,但是我们有希望一个实例对象中存储的元素的类型时一致的,这就需要泛型来实现操作。
int[] arr1 = new int[] {159,357,456};//没有用泛型,ArrayList中存储的元素格式各样,实际开发中在操作时是很容易出现问题的List list1 = new ArrayList();list1.add(123);list1.add("敲代码的阿茄");list1.add(arr1);//使用泛型,限制ArrayList存放的元素的类型,就不能添加存储其他类型的元素了List<String> list2 = new ArrayList<>();list2.add("敲");list2.add("代");list2.add("码");list2.add("的");list2.add("阿");list2.add("茄");//list2.add(123);//无法添加//list2.add(arr1);//无法添加
泛型使用的基本要求
- 异常类不能声明为泛型。
- 泛型不能是基本数据类型,需要使用基本数据类型的泛型可以写成其包装类。
//List<int> list2 = new ArrayList<>();List<Integer> list2 = new ArrayList<>();
自定义泛型类
在类或接口中声明的泛型,可以作为非静态属性的类型、非静态方法的参数类型、非静态方法的返回值。但是,不能在静态方法中使用类的泛型。
// 泛型类:类中定义有不确定的类型public class Dict<T> {String dictName;int dictCount;T dictT;//泛型类下用了泛型的方法,报错,需要去掉static//public static void get(T dictT) {// this.dictT = dictT;//}//泛型类下没用泛型的方法public static void set() {System.out.println("");}}
泛型方法和泛型类下的方法?
泛型方法:该泛型方法所在的类可以不是泛型类。往直观一点讲,方法中出现了泛型结构<>。 那么,泛型方法可以是静态的吗?可以,因为泛型参数是在调用方法时确定的,并非在实例化时确定的。
public class GenericTest {public static void main(String[] args) {Dict<Float> dict = new Dict<>();dict.set1(0.0f);//调用泛型方法,泛型类型跟类的泛型没关系,不受影响dict.set2(" ");dict.set2(36);dict.set2(new ArrayList());}}//泛型类class Dict<T> {String dictName;int dictCount;//泛型类中的方法:如果调用了泛型则不能为静态public void set1(T dictT) {System.out.println("我是泛型类下的方法");}//泛型方法:可以为静态public static <T> void set2(T dictT) {System.out.println("我是泛型方法");}}
泛型与继承
- 如果类A是类B的父类,但是,
G<A>
不是G<B>
的父类(G是类或者接口),两个属于不同的类。所以不存在两者间的多态和向上转型。 - 但是呢,
A<G>
仍然是B<G>
的父类。
通配符
通配符:?
- 利用通配符,创建二者的共同父类,
G<A>
和G<B>
的共同父类G<?>
; - 但是,不能往其中添加新数据,常用于赋值操作而已,仅能添加
null
; - 允许读取数据,读取数据的类型为object;
举例说明:定义List<?>
是List<Object>
和List<String>
的公共父类。
//不能添加数据,除了nullList<?> list = new ArrayList<>();//list.add(16);//报错//list.add(" ");//报错list.add(null);//允许读取数据List<?> list = new ArrayList<>();List<String> list1 = new ArrayList<>();list1.add("newstring");list =list1;list.add(null);Object obj = list.get(0);System.out.println(obj);//newstring
有限制条件的通配符
G<? extends A>
可以作为G<A>
和G<B>
的父类,其中B是A的子类;即,可以作为所有继承于A类的类G<A的子类>
的父类。G<? super A>
可以作为G<A>
和G<B>
的父类,其中B是A的父类;即,可以作为所有A的父类的G<A的父类>
的父类。
// 下面举例类的关系:Earth extends Sun, Sun extends UniverseList<? extends Sun> list1 = new ArrayList<>();// 可以作为List<Sun及其子类>的父类List<? super Sun> list2 = new ArrayList<>();// 可以作为List<Sun及其父类>的父类List<Universe> list3 = new ArrayList<>();List<Sun> list4 = new ArrayList<>();List<Earth> list5 = new ArrayList<>();list1 = list4;// 多态list2 = list4;//多态// 读取数据Sun s1 =list1.get(0);//获取的数据是Sun或者Sun的子类的对象,可以实现多态Earth e1 =(Earth)list1.get(0);//不强转会报错,因为获取的数据可能是Sun的对象,父类转子类需要强转Sun s2=(Sun)list2.get(0);//不强转会报错,获取的数据可能是Sun的父类,父类转子类需要强转Object o=list2.get(0);//不强转情况下,只能是Object// 写入数据list2.add(new Sun());//只能添加Sun本身,或者Sun的子类//因为list2存的可能是Sun及其父类,假设new的是Universe,但是list2中存储的是Sun,//即实际?=Sun,那么Universe作为父类是无法直接赋给子类的list2.add(new Earth());//list1.add();//无法添加数据,因为你无法确定存储的子类有多小
获取list泛型_泛型相关推荐
- java快速排序泛型_泛型算法_快速排序源码
#include using namespace std;int a[1000000];void qsort(int l,int r){int x=a[l];int i=l;int j=r;if(l& ...
- java 获取泛型_聊聊Java泛型擦除那些事
>版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/89789849 出自:shushen ...
- 复习Collection_迭代器使用细节_泛型_综合案例
Collection_迭代器使用细节_泛型_综合案例 主要内容 Collection集合 迭代器 增强for 泛型 第一章 Collection集合 1.1 集合概述 集合:集合是java中提供的一种 ...
- 不正确 有三种形式 说法 通配泛型_一看就懂 详解JAVA泛型通配符T,E,K,V区别...
1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛 ...
- 泛型方法的定义和使用_泛型( Generic )
泛型(Generic) 1. 泛型概述 泛型是一个未知的, 不确定的数据类型. 比如ArrayList 中的E, 就是一个未知的不确定的数据类型, 那么他就是一个泛型 泛型虽然是一个未知的, 不确定的 ...
- android 集成同一interface不同泛型_【Java视频教程】day30-泛型??
泛型 泛型的引入 需求:打印集合中所有字符串的长度: 结论: 再使用集合时,因为集合中可以保存不同类型的数据,保存进入集合后不管什么类型的数据都会自动向上转型为Object类型, 所以实际使用时一般需 ...
- SSH整合中,使用父action重构子类action类.(在父类中获取子类中的泛型对象)
import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type;import com.opensymphony.xw ...
- java数组的下界,Java泛型_上界extends_下界super
Java泛型_上界extends_下界super ? 通配符类型 extends T> 表示类型的上界,表示参数化类型的可能是T或是T的子类 super T> 表示类型下界(Java C ...
- 4_常用类_集合_泛型
JavaSE_第四周 包装类 基本类型 包装类类型(引用类型:默认值都是null) byte Byte short Short int Integer long Long float Float do ...
最新文章
- OKR工作法没有用好陷入了这三个坑
- Redis的应用场景及优缺点
- 使用sed和awk取除最后两个字段之外的字段
- vim 双剑合璧,天下无敌(笔记)
- Eclipse——通过Eclipse Marketplace安装SVN插件subclipse以及简单使用
- MySQL性能优化点记录
- linux中用anaconda使用不同版本python
- QT c++ 中使用PostMessage/SendMessage实例
- maven学习(一)
- Visual Entity 手册(一)简介
- java设计模式2--工厂模式
- 安卓beforetextchanged_【已解决】Android中给EditText添加的TextWatcher中的onTextChanged始终被调用(被执行多次)...
- macOS Big Sur:快速入门的50个使用技巧
- Android与Windows Socket通信,TLS双向认证
- DFS:寻路问题(Roads)
- 英语单词记忆测试软件,适用于检查学生英语单词背诵情况的软件
- uni-app以h5网页的方式发布企业微信应用
- smtplib 改为通过SSL 465 发送邮件
- 5分绩点转4分_5分GPA3.7转化成4分制大概是多少了
- 元素水平垂直居中的六种方式
热门文章
- 精讲23种设计模式-策略模式~聚合短信服务和聚合支付服务
- vue 单独页面定时器 离开页面销毁定时器
- Apache JMeter 字体、字体大小修改
- 如何查看一个组件的 classid是多少_如何查看iphone电池使用次数?6s电池容量多少需要更换?...
- linux下装sqlserver安装包,【sqlServer】CentOS7.x 上Microsoft SQL Server for Linux安装和配置...
- python 发邮件 timeout_Python邮件发送/带附件发送
- C语言 数组排序 – 冒泡法排序 - C语言零基础入门教程
- 多线程:生产者消费者问题
- jq之callback
- 如何在linux安装mysql7版本的,如何在linux下用tar方式安装Mysql5.7版本