泛型

奋斗吧
奋斗吧
擅长邻域:未填写

标签: 泛型 Java博客 51CTO博客

2023-05-18 18:24:01 186浏览

泛型,1.  泛型的理解和好处1)请编写程序,在ArrayList中,添加3个Dog对象2) Dog对象含有name和age,并输出name和age (要求使用getXxx())1.1 先使用传统的方法来解决  553代码在com.stulzl.generic_01.包中Generic01packagecom.stulzl.gene

1.  泛型的理解和好处

1)请编写程序,在ArrayList中,添加3个Dog对象

2) Dog对象含有name和age,并输出name和age (要求使用getXxx())

1.1 先使用传统的方法来解决  553

泛型_java

代码在com.stulzl.generic_01.包中
Generic01
package com.stulzl.generic_01;

import java.util.ArrayList;

//泛型引入 普通方法  553
//1)请编写程序,在ArrayList中,添加3个Dog对象
//2) Dog对象含有name和age,并输出name和age (要求使用getXxx())
@SuppressWarnings({"all"})
public class Generic01 {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add(new Dog("旺财",10));
        arrayList.add(new Dog("发财", 1));
        arrayList.add(new Dog("小黄", 5));

        //这样写没问题
        //但是假如我们的程序员,不小心,添加了一只猫
        arrayList.add(new Cat("招财猫",8));//此时遍历就出了问题

        //遍历
        for (Object o :arrayList) {
            //向下转型Object->Dog
            Dog dog = (Dog)o;
            System.out.println(dog.getName()+" "+dog.getAge());
        }
        

    }
}
class Dog {
    private String name;
    private int age;
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

class Cat { //Cat类
    private String name;
    private int age;
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

1.1.1 使用传统方法的问题分析

1)不能对加入到集合ArrayList中的数据类型进行约束(不安全)

2)遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响

1.2 泛型解决上述问题——快速入门  554

代码在com.stulzl.generic_02.包中

Generic02
package com.stulzl.generic_02;

import java.util.ArrayList;

//泛型引入 泛型方法  554
//1)请编写程序,在ArrayList中,添加3个Dog对象
//2) Dog对象含有name和age,并输出name和age (要求使用getXxx())
@SuppressWarnings({"all"})
public class Generic02 {
    public static void main(String[] args) {

        ArrayList arrayList = new ArrayList();
        //使用传统的方法来解决===> 使用泛型
        //解读
        //1. 当我们 ArrayList 表示存放到 ArrayList 集合中的元素是 Dog 类型 (细节后面说...)
        //2. 如果编译器发现添加的类型,不满足要求,就会报错
        //3. 在遍历的时候,可以直接取出 Dog 类型而不是 Object
        //4. public class ArrayList {} E 称为泛型,那么 Dog->E

        arrayList.add(new Dog("旺财",10));
        arrayList.add(new Dog("发财", 1));
        arrayList.add(new Dog("小黄", 5));
        //但是假如我们的程序员,不小心,添加了一只猫
        //arrayList.add(new Cat("招财猫",8));//使用了泛型直接加入不了arrayList而报错

        //遍历
        System.out.println("====使用泛型====");
        for (Dog dog :arrayList) {//这里直接使用Dog接收而不是Object,更加方便
            System.out.println(dog.getName()+" "+dog.getAge());
        }

    }
}
class Dog {
    private String name;
    private int age;
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

class Cat { //Cat类
    private String name;
    private int age;
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

2. 泛型的好处  554

1)编译时,检查添加元素的类型,提高了安全性

2)减少了类型转换的次数,提高效率[说明]

不使用泛型

Dog -加入-> Object -取出-> Dog //放入到ArrayList会先转成Object ,在取出时,还需要转换成Dog

使用泛型

Dog-加入-> Dog-取出-> Dog //放入时,和取出时,不需要类型转换,提高效率

3)不再提示编译警告

3. 泛型的介绍  555

inta = 10;

理解:泛(广泛)型(类型) => Integer, String,Dog   可以认为泛型就是表示数据类型的一种数据类型

泛型_System_02

1)泛型又称参 数化类型,是Jdk5.0 出现的新特性,解决数据类型的安全性问题

2) 在类声明或实例化时只要指定好需要的具体的类型即可。

3) Java泛型可以保证如果程序在编译时没有发出警告, 运行时就不会产ClassCastException异常。同时,代码更加简洁、健壮

4)泛型的作用是:可以在类声明时通过一个标识表示类中某个属性的类型,或者是某个方

法的返回值的类型,或者是参数类型。

代码在com.stulzl.generic_03.包中

Generic03

package com.stulzl.generic_03;

//泛型介绍  555
public class Generic03 {
    public static void main(String[] args) {
        Person person = new Person("中国");//可以这样理解这个String就会代替E
        person.show();//class java.lang.String
        
        Person person1 = new Person(100);
        person1.show();//class java.lang.Integer
    }
}
//泛型的作用是:可以在类声明时通过一个标识表示类中某个属性的类型,或者是某个方
//法的返回值的类型,或者是参数类型。
class Person{
    //注意,特别强调: E 具体的数据类型在是在定义 Person 对象的时候指定,
    // 即在编译期间,就确定 E 是什么类型了
    E s;

    public Person(E s) {//E 也可以是参数类型
        this.s = s;
    }
    public E f(){//返回类型使用 E
        return s;
    }

    //显示类型方法
    public void show(){
        System.out.println(s.getClass());//显示s类型
    }
}

4. 泛型的语法  556

4.1 泛型的声明

interface接口{}和class类{}

//比如: List,ArrayList

说明:

1)其中,T,K,V不代表值,而是表示类型。

2)任意字母都可以。常用T表示,是Type的缩写

4.2 泛型的实例化

泛型_System_03

4.3 泛型使用举例  556

举例说明,泛型在HashSet, HashMap的使用情况

练习:

1.创建3个学生对象

2.放入到HashSet中学生对象,使用

3.放入到HashMap中,要求Key是String name, Value就是学生对象

4.使用两种方式遍历

代码在com.stulzl.generic_exercise01.包中

Generic_Exercise01

package com.stulzl.generic_exercise01;

import java.util.*;

//泛型实例举例  556
//1.创建3个学生对象
//2.放入到HashSet中学生对象,使用
//3.放入到HashMap中,要求Key是String name, Value就是学生对象
//4.使用两种方式遍历
@SuppressWarnings({"all"})
public class Generic_Exercise01 {
    public static void main(String[] args) {
        //使用泛型方式给HashSet 放入3个学生对象
        HashSet students = new HashSet();
        students.add(new Student("jack",18));
        students.add(new Student("tom",28));
        students.add(new Student("mary",19));
        //遍历
        System.out.println("======增强for=======");
        for (Student o :students) {//直接用Student类型接收
            System.out.println(o);
        }

        System.out.println("=====迭代器=====");
        Iterator iterator = students.iterator();
        while (iterator.hasNext()) {
            Student next = iterator.next();
            System.out.println(next);
        }

        //使用泛型方式给HashMap 放入3个学生对象
        //K -> String    V->Student
        HashMap hm = new HashMap();
        hm.put("milan",new Student("milan",28));
        hm.put("smith",new Student("smith",28));
        hm.put("lzl",new Student("lzl",28));
        //遍历
        System.out.println("====迭代器====");
        Set> entries = hm.entrySet();
        Iterator> iterator1 = entries.iterator();
        while (iterator1.hasNext()) {
            Map.Entry next = iterator1.next();
            System.out.println(next.getKey()+"-"+next.getValue());
        }

        System.out.println("=====增强for=====");
        Set sets = hm.keySet();
        for (String o :sets) {
            System.out.println(o+"-"+hm.get(o));//o代表k  hm.get(o)代表v
        }
    }
}
class Student{
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695