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 ...
随机推荐
- Python sort方法
官方文档: sort(*, key=None, reverse=False) This method sorts the list in place, using only < comparis ...
- SQL SERVER 审核
USE master CREATE SERVER AUDIT audit1 TO FILE (FILEPATH='E:\SQLAudit') USE TEST CREATE DATABASE AUD ...
- SSM中(Spring-SpringMVC-Mybatis)(二:整合)
使用Maven整合一个SSM,当然要配有Maven环境,Maven的环境配置自行百度,挺好配的 创建一个Maven项目以后,目录结构如图所示: 然后就是各部分配置: 首先pom导入依赖jar包: &l ...
- [UWP]如何使用Fluent Design System (上)
1. 前言 微软在Build 2017中公布了新的设计语言Fluent Design System(以下简称FDS),不过官网只是堆砌了各种华丽的词语以及一堆动画.至于在UWP中要做成怎么样,怎么做, ...
- Kafka的特点及使用场景
Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务.它主要用于处理活跃的流式数据. ...
- windows 纤程
纤程本质上也是线程,是多任务系统的一部分,纤程为一个线程准并行方式调用多个不同函数提供了一种可能,它本身可以作为一种轻量级的线程使用.它与线程在本质上没有区别,它也有上下文环境,纤程的上下文环境也是一 ...
- liveshow回顾
在2017年8月14号的一天接到一个即看即买的项目,大致功能如下 1.现场走秀直播同步到H5页面 2.实时显示直播间人数 3.点赞并实时显示给用户 4.在某个时间点,可以全体推送一些消息给所有用户 5 ...
- npm package.json文件解读
每个Nodejs项目的根目录下面,一般都会有一个package.json文件.该文件可以由npm init生成,定义了项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据). pa ...
- typeof关键字的作用
http://blog.chinaunix.net/uid-28458801-id-4200573.html 一.typeof详解: 前言: typeof关键字是C语言中的一个新扩展,这个特性在 ...
- 记一次lvs-tunnel模式的故障分析(7)
一.测试环境 类型 IP 负载均衡器 eth0:10.20.73.20 VIP eth0:0 10.20.73.29 后端真实机 10.0.0.7(web01).10.0.0.9(web02) ...