泛型
2023-05-18 18:24:01 185浏览
1. 泛型的理解和好处
1)请编写程序,在ArrayList中,添加3个Dog对象
2) Dog对象含有name和age,并输出name和age (要求使用getXxx())
1.1 先使用传统的方法来解决 553

代码在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 可以认为泛型就是表示数据类型的一种数据类型

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 泛型的实例化

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)展开评论
展开评论

