JAVA进阶教学之(泛型)

本文介绍了JAVA中的泛型,从泛型的概念、作用到泛型的使用及优缺点进行了详细阐述。通过代码演示,展示了泛型如何增强代码安全性,减少类型转换,并讲解了如何自定义泛型类及其在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

泛型

引言:

  • 泛型:泛型允许程序员在编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型
  • 人话:泛型对规定范围产生约束,约束后只能存储泛型指定的类型
  • 诞生:JDK5.0以后

 

  • 作用:泛型旨在程序的编译阶段起作用,只是给编译器参考使用的(运行阶段泛型没用)
  • 使用:List<类名A标识符>,表示List集合中只允许存储类名A类型的数据,用泛型来指定集合中存储的数据类型,<类名标识符>里面一般是类名,也可以自定义类名标识符

 

  • 优点:集合存储的元素类型统一,集合中取出的元素类型是泛型指定类型,不需要进行大量的“向下转型”,不需要大量的"强制类型转换"
  • 缺点:集合中存储的元素缺乏多样性

 

代码演示:

 

未使用泛型前:

package com.lbj.javase.collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class GenericTest01 {
    public static void main(String[] args) {
        List list=new ArrayList<>();

        //准备对象
        Animal animal=new Cat();
        Animal animal1=new Bird();

        //将对象添加到集合中
        list.add(animal);
        list.add(animal1);

        //遍历集合,取出每个Animal,让它move()
        Iterator iterator=list.iterator();
        while (iterator.hasNext()){
            //o中没有move方法,无法调用,需要向下转型
            Object o=iterator.next();

            //通过判断是否o属于某个类,达到转型效果
            if (o instanceof Animal){
                Animal a= (Animal) o;
                a.move();
                System.out.println(a);
            }
        }
    }

}
class Animal{
    public void move(){
        System.out.println("动物在移动");
    }
}
class Cat extends Animal{
    //子类特有方法
    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }
}
class Bird extends Animal{
    //子类特有方法
    public  void fly(){
        System.out.println("鸟在飞");
    }
}

 

使用泛型后:

package com.lbj.javase.collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class GenericTest01 {
    public static void main(String[] args) {
        List list=new ArrayList<>();

        //准备对象
        Animal cat=new Cat();
        Animal bird=new Bird();

        //将对象添加到集合中
        list.add(cat);
        list.add(bird);

        //遍历集合,取出每个Animal,让它move()
//        Iterator iterator=list.iterator();
//        while (iterator.hasNext()){
//            //o中没有move方法,无法调用,需要向下转型
//            Object o=iterator.next();
//
//            //通过判断是否o属于某个类,达到转型效果
//            if (o instanceof Animal){
//                Animal a= (Animal) o;
//                  a.move();
//                System.out.println(a);
//            }
        //}
        //获取迭代器
        Iterator<Animal> iterator=list.iterator();
        //遍历集合,表示迭代器迭代的是Animal类型
        while (iterator.hasNext()){
            //使用泛型后,每一次迭代返回的数据都是Animal类型
            Animal animal=iterator.next();
            animal.move();
            System.out.println(animal);

            //调用子类特有的方法还是需要继续向下转型的
            if (animal instanceof Cat){
                Cat c= (Cat) animal;
                c.catchMouse();
            }
            if (animal instanceof Bird){
                Bird b= (Bird) animal;
                b.fly();
            }
        }
    }

}
class Animal{
    public void move(){
        System.out.println("动物在移动");
    }
}
class Cat extends Animal{
    //子类特有方法
    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }
}
class Bird extends Animal{
    //子类特有方法
    public  void fly(){
        System.out.println("鸟在飞");
    }
}

 

自定义泛型:

引言 :

自定义泛型类就是把泛型定义在类上,用户使用该类的时候,才把类型明确下来

 

自定义泛型的时候,<>是尖括号中的一个标识符,内容随便写

java源代码中经常出现的<E>和<T>

<E> 表示 Element

<T>表示 Type

 

用户想要使用哪种类型,就在创建的时候指定类型。使用的时候,该类就会自动转换成用户想要使用的类型了。

 

代码演示:

package com.lbj.javase.collection;

/**
 * @author LBJ
 * @version V1.0
 * @Package com.lbj.javase.collection
 * @date 2021/4/10 15:49
 * @Copyright 公司
 */
public class GenericTest03{
//类比得出结论
public static void main(String[] args) {
    //创建对象并指定元素类型
    ObjectTool<String> tool = new ObjectTool<>();

    tool.setObj(new String("asdfghjkl"));
    String s = tool.getObj();
    System.out.println(s);


    //创建对象并指定元素类型
    ObjectTool<Integer> objectTool = new ObjectTool<>();
    /**
     * 如果我在这个对象里传入的是String类型的,它在编译时期就通过不了了.
     */
    //objectTool.setObj("asda");
    objectTool.setObj(10);
    int i = objectTool.getObj();
    System.out.println(i);
}
}

class ObjectTool<T>{
    public T obj;

    public T getObj() {
        return obj;
    }

    public void setObj(T obj) {
        this.obj = obj;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值