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


    1. public class test01 {
    2. //泛型可以用在方法接口类,泛型的类型只能是引用类型而不是基本类型
    3. public static void main(String[] args) {
    4. ArrayList<Object> ob = new ArrayList<>();
    5. //new 集合没有指定泛型 存放的类型是object,
    6. //集合的迭代器
    7. ArrayList strings = new ArrayList<>();
    8. strings.add("m1");
    9. strings.add("s1");
    10. strings.add("c1");
    11. strings.add(12);
    12. Iterator myiterator=strings.iterator();
    13. while(myiterator.hasNext())
    14. {
    15. //如果取出stirngs 的存放类型,会发现object类型
    16. //为了避免类型转换异常,要先对类型进行判断
    17. Object next = myiterator.next();//自动补全ctrl+aalt+v
    18. if (next instanceof String)//类型匹配instanceof
    19. {
    20. String str=(String)next;//强制转换
    21. System.out.println(str);
    22. }
    23. if(next instanceof Integer)
    24. {
    25. int a=(Integer) next;
    26. System.out.println(a);
    27. }
    28. // String str=(String)myiterator.next();//做个强转
    29. //String str=myiterator.next();//直接转会报错,因为存储的是object
    30. // System.out.println(myiterator.next());一般形式下这样遍历
    31. // System.out.println(str);//12会报错,因为Integer类型不能强转成Stirng
    32. }
    33. }
    34. }

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

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

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

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

     

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

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

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

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

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

     

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

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

    泛型接口

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

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

     

    1. public interface Maiyiinterface {
    2. T show(T t);
    3. }
    4. public class MaiyiIMPL implements Maiyiinterface{
    5. @Override
    6. public T show(T t) {
    7. return t;
    8. }
    9. }
    10. public class test03 {
    11. public static void main(String[] args) {
    12. //泛型接口
    13. MaiyiIMPL<String> stringMaiyiIMPL = new MaiyiIMPL<>();
    14. stringMaiyiIMPL.show("a");
    15. MaiyiIMPL<Integer> integerMaiyiIMPL = new MaiyiIMPL<>();
    16. integerMaiyiIMPL.show(12);}
    17. }

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

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

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

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

     

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

    类型通配符

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

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

    1. public class test03 {
    2. public static void printlist(ArrayList thelist)
    3. {
    4. Object o = thelist.get(0);
    5. }
    6. public static void main(String[] args) {
    7. ArrayList<String> str=new ArrayList<String>();
    8. ArrayList<Integer> integers = new ArrayList<>();
    9. printlist(str);

     

  • 相关阅读:
    Unity —— 复建(day1)
    [iOS]UI分析工具Reveal
    【JAVA】基础语法
    扒去Spring事件监听机制的外衣,竟然是观察者模式
    Python办公软件自动化,5分钟掌握openpyxl操作
    第 28 篇 : SSH秘钥登录
    [计算机毕业设计]大数据疫情分析与可视化系统
    docker 构建docker-compose
    假期学生休闲用什么蓝牙耳机?高配置蓝牙耳机推荐
    浅谈C++|构造.析构函数篇
  • 原文地址:https://blog.csdn.net/weixin_58778545/article/details/126302978