2Java加强-----泛型

1.认识泛型

public class GenericDemo1 {
    public static void main(String[] args) {
        // 目标:认识泛型,搞清楚使用泛型的好处。
        ArrayList list = new ArrayList();
        list.add("java");
        list.add("php");
        list.add(23);
        list.add(99.9);
        list.add(true);
        list.add('a');
        list.add(new Object());


        // 获取数据。
        for (int i = 0; i < list.size(); i++) {
            Object rs = list.get(i);
            // 把数据转型处理。
            String s = (String) rs;
            System.out.println(s);


        }
    }
}

观察上面代码,当处理到整数类型时就会报错.而且每次都要强制转型,麻烦,因此引出泛型

public class GenericDemo1 {
    public static void main(String[] args) {
        // 目标:认识泛型,搞清楚使用泛型的好处。
        ArrayList<String> list = new ArrayList<String>();
        list.add("java");
        list.add("php");
//        list.add(23);
//        list.add(99.9);
//        list.add(true);
//        list.add('a');
//        list.add(new Object());


        // 获取数据。
        for (int i = 0; i < list.size(); i++) {
//            Object rs = list.get(i);
//            // 把数据转型处理。
//            String s = (String) rs;
//            System.out.println(s);

            String s = list.get(i);
            System.out.println(s);
        }
    }
}

2.泛型接口

//定义学生类
public class Student {
    
}

public interface Operate<T> {
    void add(T t);
    void delete(T t);
    void update(T t);
    T query(int id);
}
public class StudentOperate implements Operate<Student>{

    @Override
    public void add(Student student) {

    }

    @Override
    public void delete(Student student) {

    }

    @Override
    public void update(Student student) {

    }

    @Override
    public Student query(int id) {
        return null;
    }
}
public class Test {
    public static void main(String[] args) {
        StudentOperate studentOperate = new StudentOperate();
        studentOperate.add(new Student());
        studentOperate.add(new Student());
        studentOperate.add(new Student());

    }
}

3.泛型方法

public class Test {
    public static void main(String[] args) {
        String[] strs = {"1", "2", "3"};
        Student[] students = new Student[4];
        print(strs);
        String s = getMax(strs);
        Student student = getMax(students);
    }

    public static <T> void print(T t) {

    }

    public static <T> T getMax(T[] t) {
        return null;
    }
}

4.通配符

public class GenericDemo5 {
    public static void main(String[] args) {
        // 目标:理解通配符和上下限。
        ArrayList<Xiaomi> xiaomis = new ArrayList<>();
        xiaomis.add(new Xiaomi());
        xiaomis.add(new Xiaomi());
        xiaomis.add(new Xiaomi());
        go(xiaomis);

        ArrayList<BYD> byds = new ArrayList<>();
        byds.add(new BYD());
        byds.add(new BYD());
        byds.add(new BYD());
        go(byds);

//        ArrayList<Dog> dogs = new ArrayList<>();
//        dogs.add(new Dog());
//        dogs.add(new Dog());
//        dogs.add(new Dog());
//        go(dogs);
    }

    // 需求:开发一个极品飞车的游戏。
    // 虽然Xiaomi和BYD是Car的子类,但是 ArrayList<Xiaomi>  ArrayList<BYD>和 ArrayList<Car> 是没有半毛钱关系!
    public static void go(ArrayList<? extends Car> cars) {
    }
}

5.泛型支持的类型

那么泛型为什么不支持基本数据类型呢?

来看下面这段代码

 // 目标:搞清楚泛型和集合不支持基本数据类型,只能支持对象类型(引用数据类型)。
         ArrayList<int> list = new ArrayList<>();
        // 泛型擦除:泛型工作在编译阶段,等编译后泛型就没用了,所以泛型在编译后都会被擦除。所有类型会恢复成Object类型
         list.add(12);
         Object a=12;

特殊方法经过反编译,ArrayList这个类型最终会编译为Object类型,而Object类型必须指向对象

如果支持基本数据类型的话,ArrayList可以加12进去,编译完后,底层是用Object来接,也就意味着你把12交给object,而object只能指向对象,而12不是对象,所以不行

5.1包装类

但是总得用基本数据类型吧,这样就引出了包装类

 // 把基本数据类型变成包装类对象。
        // 手工包装:
        // Integer i = new Integer(100); // 过时
        Integer it1 = Integer.valueOf(100);  // 推荐的

// 自动装箱成对象:基本数据类型的数据可以直接变成包装对象的数据,不需要额外做任何事情
        Integer it11 = 130;
        Integer it22 = 130;
        System.out.println(it11 == it22);

        // 自动拆箱:把包装类型的对象直接给基本类型的数据
        int i = it11;
        System.out.println(i);

 ArrayList<Integer> list = new ArrayList<>();
        list.add(130);  // 自动装箱
        list.add(120);  // 自动装箱
        int rs = list.get(1); // 自动拆箱

// 1、把基本类型的数据转换成字符串。
        int j = 23;
        String rs1 = Integer.toString(j);   // "23"
        System.out.println(rs1 + 1); // 231

        Integer i2 = j;
        String rs2 = i2.toString(); // "23"
        System.out.println(rs2 + 1 ); // 231

        String rs3 = j + "";
        System.out.println(rs3 + 1 ); // 231

  // 2、把字符串数值转换成对应的基本数据类型(很有用)。
        String str = "98";
        // int i1 = Integer.parseInt(str);
        int i1 = Integer.valueOf(str);
        System.out.println(i1 + 2);

        String str2 = "98.8";
//        double d = Double.parseDouble(str2);
        double d = Double.valueOf(str2);
        System.out.println(d + 2);

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值