public class test01 {//泛型可以用在方法接口类,泛型的类型只能是引用类型而不是基本类型public static void main(String[] args) {ArrayList<Object> ob = new ArrayList<>();//new 集合没有指定泛型 存放的类型是object,//集合的迭代器ArrayList strings = new ArrayList<>();strings.add("m1");strings.add("s1");strings.add("c1");strings.add(12);Iterator myiterator=strings.iterator();while(myiterator.hasNext()){//如果取出stirngs 的存放类型,会发现object类型//为了避免类型转换异常,要先对类型进行判断Object next = myiterator.next();//自动补全ctrl+aalt+vif (next instanceof String)//类型匹配instanceof{String str=(String)next;//强制转换System.out.println(str);}if(next instanceof Integer){int a=(Integer) next;System.out.println(a);}// String str=(String)myiterator.next();//做个强转//String str=myiterator.next();//直接转会报错,因为存储的是object// System.out.println(myiterator.next());一般形式下这样遍历// System.out.println(str);//12会报错,因为Integer类型不能强转成Stirng}}
}

泛型类,泛型接口都是在类名,接口名后尖括号

泛型方法在返回类型前尖括号 public <T> T show(T t){}

--------------------------------------------------------------------------

泛型类,类中的成员属性T 类上定义的泛型类型相同

public class mayikt <T>{private T t;public T getT() {return t;}public void setT(T t) {this.t = t;}
}//泛型类,在类中定义的成员属性 T 和类上定义的泛型是同一个

这样,创建mayikt类的不同对象,每个对象使用的类型T是不一样的,每个对象的成员方法所用的泛型也是独特的

public class test02 {public static void main(String[] args) {mayikt<String> str=new mayikt<>();//str是mayikt类的一个对象,使用的泛型Stringstr.setT("Q");System.out.println(str.getT());mayikt<Integer> interger=new mayikt<>();//integer是同一类的另一个对象,使用的泛型Integerinterger.setT(12);System.out.println(interger.getT());mayikt ob=new mayikt<>();//有尖括号就算使用泛型,但没规定泛型种类默认Object,是所有引用类型的父类ob.setT("1122");ob.setT(1222);}
}

---------------------------------------------------------------------------------------------------------------------------------

泛型方法,可以用一个类型的同一个对象,但是 方法 的 参数的泛型 和 方法的泛型是一一对应的

public class meite {public <T> T show(T t){return t;}//泛型方法,同一对象,传的参数泛型不同,可以用ctrl+alt+v自动补全来验证
}
public class test03 {public static void main(String[] args) {meite m=new meite();System.out.println(m.show("aaa"));//<String> String show(String str)System.out.println(m.show(12));/*快捷键ctrl+alt+v//自动识别返回类型integer,并用show接收*/Integer show = m.show(13);Double show1 = m.show(12.3);

----------------------------------------------------------------------------------------------------------------

泛型接口

接口规定泛型,继承接口的类也会使用此泛型

用到了两个泛型,show方法的泛型M 类的泛型T,方法返回值类型T

public interface Maiyiinterface <T>{T show(T t);
}public class MaiyiIMPL<T> implements Maiyiinterface<T>{@Overridepublic T show(T t) {return t;}
}public class test03 {public static void main(String[] args) {//泛型接口MaiyiIMPL<String> stringMaiyiIMPL = new MaiyiIMPL<>();stringMaiyiIMPL.show("a");MaiyiIMPL<Integer> integerMaiyiIMPL = new MaiyiIMPL<>();integerMaiyiIMPL.show(12);}
}

-----------------------------------------------------------------------------------------------------------

可变参数 String...a,范型底层擦除机制

可变参数是基于数组实现的

package first.day01;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class test04 {public static void main(String[] args) {System.out.println(sum(1,1,1));//int...a 可变参数是基于数组实现a[0]=1,a[1]=1...//因为数组长度不能确定,所以有别的参数时把可变参数往往放最后sum2(0,1,1);Arrays.asList();//ctrl+shift+i 进入源码,发现用的就是可变参数,传入一些参数,返回一个集合List<String> strings = Arrays.asList("a", "x", "v");//List<xxx> xxx这样接住//但是使用arrays.aslist创建的集合是不能进行添加和删除的,因为创建完了·集合元素个数是不能改变的,不过可以进行修改strings.set(0,"m");//输出[m,x,v]System.out.println(strings);//直接把集合输出,不会输出地址ArrayList<String> strings1 = new ArrayList<>();List newlist=strings1;//不要用尖括号,即使是object类型也已经使用泛型了,不可以newlist.add(12);//泛型底层的擦除机制,把使用泛型的集合整个付给没使用泛型的集合,泛型就会被擦出,add时不会限制传递类型/*泛型是在编译阶段限制传递的类型 在运行阶段都是擦除底层·class文件 在运行时是 没有使用泛型的如何证明:run一下,在out文件夹里拖进xjad反编译发现没用泛型*/}public static int sum(int ...a) {int s = 0;for (int i = 0; i < a.length; i++) {s = s + a[i];}return s;}public static void sum2(int b,int ...a){System.out.println("不参与运算"+b);for(int i:a)//证实a是个数组形式存储的{System.out.println(i);}}
}
public class xjad {public static void main(String[] args) {ArrayList<String> sr=new ArrayList<>();List l=sr;l.add(12);//run后在out找到拖进xjad反编译发现源码根本没用到泛型,这时l的泛型类型object}
}

----------------------------------------------------------------------

类型通配符

类型通配符不能add 因为还没限制操作的泛型类型,一般用于接收,剩下的操作用if条件句自己编

带通配符的可以get操作,得到的类型是object

public class test03 {public static void printlist(ArrayList<?> thelist){Object o = thelist.get(0);}public static void main(String[] args) {ArrayList<String> str=new ArrayList<String>();ArrayList<Integer> integers = new ArrayList<>();printlist(str);

 alt+ctrl+shift+a 截长图

截图 alt+a

找构造器,getter等:alt+insert

泛型类,泛型接口,泛型方法,底层擦除机制,可变参数,限类型通配符,反编译xjad相关推荐

  1. Java反射机制的原理与使用(反编译)

    一. 原理 简单的来说,反射机制其实就是指程序在运行的时候能够获取自身的信息.如果知道一个类的名称/或者它的一个实例对象, 就能把这个类的所有方法和变量的信息(方法名,变量名,方法,修饰符,类型,方法 ...

  2. 什么是泛型,为什么要使用泛型? 泛型类和泛型方法的实现以及限定通配符的使用。什么是泛型擦除,为什么有泛型擦除,泛型擦除到底是怎么实现的

    1. 泛型的定义和意义 1.1 什么叫泛型? 泛型,顾名思义就是广泛的类型,专业术语为"参数化类型":当我们创建对象时没指定类型,任何引用类型都可以使用,兼容多种数据类型.如果是基 ...

  3. 【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )

    文章目录 一.泛型简介 二.泛型类 三.泛型方法 四.静态方法的泛型 五.泛型类与泛型方法完整示例 一.泛型简介 泛型 可以 简单理解为 参数化类型 , 主要作用在 类 , 方法 , 接口 上 ; j ...

  4. Java泛型(泛型类,泛型方法,静态方法泛型,泛型类与泛型方法例子)

    泛型 泛型简介 泛型可以理解为参数化类型,主要作用在类,方法和接口上. Java泛型 与 C++ 模板 : Java 中的泛型 , 是仿照 C++ 中的模板开发的 , 目的是让开发者可以写出通用,灵活 ...

  5. 泛型类与泛型方法的说明

    目录 1. 泛型的提出 2. 在集合中使用泛型 3. 自定义泛型类 1. 使用泛型类 2. 子类继承泛型类 4. 泛型方法 1. 泛型的提出 List中默认的类型是Object,当我们向List中传入 ...

  6. java 使用反射调用可变参数方法

    使用反射操作对象-调用可变参数方法 要把可变参数都当做是其对应的数组类型参数; 如 show(XX... is)作为show(XX[] is)调用; 若可变参数元素类型是引用类型: JDK内部接收到参 ...

  7. printf 函数使用 可变参数函数实现原理

    一. Printf 和scanf 函数格式 Printf 和 scanf 家族函数都属于可变参数函数(variadic function).这种函数需要固定数量的强制参数,后面是数量可变的可选参数. ...

  8. C语言可变参数函数_初探

    一.什么是可变参数函数 C语言允许定义参数数量可变的函数,这称为可变参数函数(variadic function).这种函数需要固定数量的强制参数,后面是数量可变的可选参数. 其中,强制参数必须至少一 ...

  9. 八、Java面向对象编程(类、对象、方法、重载、可变参数、作用域、构造器、this本质)

    文章目录 Java面向对象编程(类.对象.方法.重载.可变参数.作用域.构造器.this本质) 一.类与对象 1. 类与对象的引出 2. 使用现有技术解决 3. 现有技术解决的缺点分析 4. 类与对象 ...

  10. c语言中函数名可变,C语言中可变参数函数

    转帖两封: 首先在介绍可变参数表函数的设计之前,我们先来介绍一下最经典的可变参数表printf函数的实现原理. 一.printf函数的实现原理 在C/C++中,对函数参数的扫描是从后向前的.C/C++ ...

最新文章

  1. Machine Learning | (2) sklearn数据集与机器学习组成
  2. 行业场景智能应用,解锁边缘计算时代新机遇
  3. 三招助你轻松搞定超Diao氛围
  4. x86汇编-1(第一章—第二章)8086处理器基本情况
  5. Linux实战考试题:批量创建用户和密码-看看你会么?
  6. 学习swing鼠标点击事件心得体会_西门子COMOS软件开发定制学习8-查询列表间的数据交互...
  7. 计算机图形学图形旋转_计算机图形学中的平板显示
  8. 基于Kubernetes的Spark部署完全指南
  9. 本地创建多个ssh-key
  10. java输出到txt,换行问题
  11. 20行代码实现网页图片抓取。(待完善
  12. 10. Document getElementsByTagName() 方法
  13. Java:对于Borderlayout布局管理的理解
  14. BZOJ1911[APIO2010] 特别行动队
  15. 手机WAPI功能检测常见问题分析(系列连载二):证书鉴别功能
  16. 状态空间离散化matlab,状态空间方程离散化的matlab处理
  17. 三线压力传感器原理_压力传感器 压力传感器原理
  18. 《上古卷轴5:天际》控制台代码之装备
  19. 商学院学习笔记(2)
  20. bootstrap简单的页面布局

热门文章

  1. 设计房屋租赁管理系统--PostgreSQL--数据库原理及应用
  2. 三容水箱液位控制系统_过程控制实验-三容水箱液位控制系统
  3. SPI协议简介—学习笔记
  4. edius裁剪快捷键_edius常用快捷键
  5. 基于weber的齿轮啮合刚度计算
  6. 智能聊天对话机器人的对比
  7. 复习了C++前几章,做一个ASCII码转换的小程序
  8. abaqus移动热源DFLUX
  9. Crack内网通积分规则(基于版本3.4.3035)
  10. PTA 7-31 掉入陷阱的