JavaSE笔记-泛型
定义带泛型的类
public class Cat<T> {
//可以用T定义实例变量
private T name;
//可以用T定义形参
//构造器没有<>
public Cat(T name){
this.name = name;
}
//可以作为返回值
public T forget(){
System.out.println("我叫啥来着?");
return this.name;
}
public static void main(String[] args){
Cat<String> cat = new Cat<>("阿猫");
System.out.println(cat.forget());
}
}
构造泛型对象可省略类型参数
List<String> list = new ArrayList<>();
//等价于List<String> list = new ArrayList<String>();
//编译器会自己推出后边的类型是String
泛型方法
1.泛型方法可以在普通类或者泛型类
2.类型参数放在修饰符之后,返回值之前
public static <T> void test();
不能在静态变量或者静态方法中使用泛型变量,不能实例化泛型变量
因为泛型是要在对象创建的时候才知道是什么类型的,而对象创建的代码执行先后顺序是static的部分,然后才是构造函数等等。所以在对象初始化之前static的部分已经执行了,如果你在静态部分引用的泛型,那么毫无疑问虚拟机根本不知道是什么东西,因为这个时候类还没有初始化。因此在静态方法、数据域或初始化语句中,为了类而引用泛型类型参数是非法的
public class Entry<k,v>{
//以下2种方式是错误的
private static V value;
public static void setValue(V value){};
}
泛型不同类型相同
List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
System.out.println(list1.getClass() == list2.getClass());
上面的代码返回值是true,因此list1和list2都是List类型,与泛型不泛型无关。
类型通配符(?)
public void getFamaleCat(List<?> list){
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
1.当不确定传入的类型时,使用类型通配符?,不要使用List<Object>,当你想要传入一个List<String>作为参数时,程序编译不会通过,而使用?则可以通过
2.当确定类型是某个类的子类型时,使用<? extends Father>,这时传入的类型只能是Father及其子类
public class Util{
/*
方法实现将src中的数据复制到dest中
那么src中的数据类型只能是dest中数据类型的子类型
比如:src中类型是Integer,dest中可以是Integer,Number,Object
*/
public static <T> void copy(List<T> dest,List<? extends T> src){
for(T d : src){
dest.add(d);
}
}
public static void main(String[] args){
List<Integer> src = new ArrayList<>();
src.add(1);
src.add(2);
List<Number> dest = new ArrayList<>();
//泛型的匹配方式是直接把参数拿过来和T比
//因为dest的类型是Number,所以推出T是Number,所以dest集合中的类型都是Number
copy(dest,src);
}
}
3.当确定类型时某个类的父类型时,使用<? super son>,这时传入的类型只能是son及son的父类
上面的例子最后dest中的数据类型都是Number,但是我们清楚的知道其实dest中每个数据的类型都是Integer,使用<? super son>改造
public class Util{
public static <T> void copy(List<? super T> dest,List<T> src){
for(T d : src){
dest.add(d);
}
}
public static void main(String[] args){
List<Integer> src = new ArrayList<>();
src.add(1);
src.add(2);
List<Number> dest = new ArrayList<>();
//dest集合中元素都是Integer类型
copy(dest,src);
}
}
4.泛型可以重载,不要包括2个意思相同的泛型方法
public static <T> void copy(List<? super T> dest,List<T> src);
public static <T> void copy(List<T> dest,List<? extends T> src);
如果我们把这2个方法定义在同一个类里,main调用copy,编译器不能确定到底调用哪个方法
public static void main(String[] args){
List<Integer> src = new ArrayList<>();
src.add(1);
src.add(2);
List<Number> dest = new ArrayList<>();
copy(dest,src);
}
类型擦除
所有的泛型类型会被编译成一个原始类型
这样并不会不安全
例如:List<String>,因为泛型会在编译的时候起作用,实际上你传入集合的所用元素都只能是String类型
public class Cat<Object> {
private Object name;
public Cat(Object name){
this.name = name;
}
public Object forget(){
System.out.println("我叫啥来着?");
return this.name;
}
}
JavaSE笔记-泛型的更多相关文章
- JAVASE笔记回顾
第一部分,JAVA基础和面向对象 part01 入门与开发环境搭建 1: 计算机基础知识(了解)(1)计算机(2)计算机硬件(3)计算机软件系统软件:windows,linux,mac应用软件:QQ, ...
- Java笔记--泛型总结与详解
泛型简介: 在泛型没有出来之前,编写存储对象的数据结构是很不方便的.如果要针对每类型的对象写一个数据结构, 则当需要将其应用到其他对象上时,还需要重写这个数据结构.如果使用了Object类型, ...
- Java学习笔记--泛型
一个泛型类就是具有一个或者多个类型变量的类. 我们可以只关注泛型,而不会为数据存储的细节而烦恼 . java泛型(一).泛型的基本介绍和使用 http://blog.csdn.net/lonelyro ...
- Java学习笔记——泛型
假定T不仅要指定接口的类继承.使用下面的方式: public class some<T extends Iterable<T> & Comparable<T>&g ...
- Thinking in Java学习笔记-泛型和类型安全的容器
示例: public class Apple { private static long counter; private final long id = counter++; public long ...
- JavaSE笔记-注释
Annotation Annotation是一个接口,可以把Annotation当成一个修饰符 Annotation的定义 注解通过@interface定义 public @interface Tes ...
- .NET复习笔记-泛型
1.yield关键字用于返回迭代器具体的值,如下框代码所示 /// 返回0~9整数集合 public static IEnumerable<int> yieldSampleMethod() ...
- Java 学习笔记 泛型
泛型 上界匹配 ? extends Number 下界匹配 ? super Number getSimpleName 不包括包名 getName 会包括包名 常和反射联合使用,做框架 Type是一个标 ...
- Java笔记——泛型擦除
1. 泛型擦除 package cn.Douzi.T_Demo; import java.util.ArrayList; /** * @Auther: Douzi * @Date: 2019/3/8 ...
随机推荐
- iOS中的armv7,armv7s,arm64,i386,x86_64
前言 一般iOS中的armv7.armv7s.arm64.i386.x86_64这些都代表了什么?在Xcode中如何选择? 介绍 armv7.armv7s.arm64都是ARM处理器的指令集. i38 ...
- Vue 爬坑之路(八)—— 使用 Echarts 创建图表
在后台管理系统中,图表是一个很普遍的元素.目前常用的图标插件有 charts, Echarts, highcharts.这次将介绍 Echarts 在 Vue 项目中的应用. 一.安装插件 使用 c ...
- 在Ubuntu下安装OpenJDK的方法
最近在看<深入理解Java虚拟机>就想试一下在ubuntu下安装一个自己的虚拟机,说实话还是废了些功夫的. 首先我的ubuntu版本是Ubuntu 14.04.5, 于是我就去OpenJD ...
- sql server 错误号大全
0 操作成功完成. 1 功能错误. 2 系统找不到指定的文件. 3 系统找不到指定的路径. 4 系统无法打开文件. 5 拒绝访问. 6 句柄无效. 7 存储控制块被损坏. 8 存储空间不足,无法处理此 ...
- iOS学习——属性引用self.xx与_xx的区别
在iOS开发过程中,我们用@proprety声明一个属性后,在代码中我们可以用self.xx与_xx来获取到这个属性.但是一直有一个疑惑,那就是这两个之间有什么区别呢?最初我一直觉得这两个之间没什么区 ...
- 【KMP模板】简单写个KMP~
本来easy的KMP 却一直过不了洛谷的模板题... 仔细一看原来在输出next数组时打的回车而不是空格... 身败名裂... 话说有个sunday貌似一般状况下比KMP快呢...去看看2333 #i ...
- Java编程思想读书笔记(二)【一切都是对象】
begin 2018年1月9日17:06:47 第二章 一切都是对象 Java语言假设我们只进行面向对象的程序设计. 2.1 用引用操纵对象 每种编程语言都有自己的操纵内存元素的方式 操纵内存元素的方 ...
- [已解决]IndentationError: unindent does not match any outer indentation level
最近跟同事合作代码没有用git进行协同,很多代码拷贝后进行粘贴,常常报以上错误. 经过查询发现是空格跟tab混合使用了,重新将代码的缩进手动调整下就好了.
- jsp+servlet登录框架模板
一.建立一个名叫jsp_servlet的工程 二.建立一个AcountBean类和CheckAccount类 1.AcountBean类包含登录名(username)和登录密码(password) p ...
- vue-cli完整地引入element-ui
1因为该组件会依赖于jQuery,所以先安装jQuery所需依赖: 进入npm控制台,输入指令: cnpm install jquery --save-dev 然后在入口文件main.js中引入: i ...