泛型的使用和作用

概述

在这里插入图片描述

泛型的使用

在这里插入图片描述

多态与泛型

在这里插入图片描述
两者要一致,Animal 和cat要一致

泛型的作用

  1. 提高 Java 程序的类型安全
    通过前面的学习我们知道, 在集合中可以添加 Object 类型的对象, 如果在不使用泛型的情况下定义了一个 ArrayList 对象, 那 么各种类的对象都可以添加到该集合中。 而在从集合中取值时, 都需要进行强制类型转换, 可以把取出的对象转换成任意类 型, 但是编译时不报错, 但是运行时会发生 ClassCastException 异常。 因此, 使用泛型可以使编译器知道集合的类型限制, 在编译期如果添加不同类型的数据就能发现错误。

  2. 消除强制类型转换
    泛型可以消除源代码中的许多强制类型转换, 这样可以使代码可读性更好, 并减少出错的机会

泛型作为方法参数

在这里插入图片描述
Book类

public class Book  extends Goods{

    @Override
    public void sell() {
        System.out.println("sell books");
    }
}

Clothes类

public class Clothes extends Goods {
    @Override
    public void sell() {
        System.out.println("sell books");
    }
}

Goods类

public abstract class Goods {
    public abstract void sell();
}

public class GoodsTest {
    public static void main(String[] args) {
        List<Book> books=new ArrayList<Book>();
        books.add(new Book());
        books.add(new Book());
        //定义服装
        ArrayList<Clothes> clothes = new ArrayList<>();
        clothes.add(new Clothes());
        clothes.add(new Clothes());
        GoodsSeller goodsSeller = new GoodsSeller();
        goodsSeller.sellGood(books);
        goodsSeller.sellGood(clothes);
    }
}

该程序的运行结果如下所示

sell books
sell books
sell books
sell books

这里要注意的是,需要
在这里插入图片描述
在遍历方法出使用? extends泛型方法,不然在测试类中无法将Book等继承类传入sellGood

自定义泛型类

将平常使用的泛型<>括号里面的数据类型变为T
理解
就是定义类时,暂时不定义数据类型用T替代,需要用到实例对象的时候,传入具体数据类型

public class NumGeneric<T> {
    private T num;

    public T getNum() {
        return num;
    }

    public void setNum(T num) {
        this.num = num;
    }

    public static void main(String[] args) {
        NumGeneric<Integer> obj = new NumGeneric<>();
        obj.setNum(100);
        System.out.println("所传入数据为:"+obj.getNum());
    }
}

该程序的运行结果如下所示

所传入数据为:100

使用方法2:传入两个自定义数据类型

例2

public class NumGeneric<T,X> {
    private T num1;
    private X num2;

    public void getNum (T num1,X num2) {
        this.num1 = num1;
        this.num2 = num2;
    }

    public T getNum1() {
        return num1;
    }

    public void setNum1(T num1) {
        this.num1 = num1;
    }

    public X getNum2() {
        return num2;
    }

    public void setNum2(X num2) {
        this.num2 = num2;
    }


    public static void main(String[] args) {
        NumGeneric<Integer,Float> obj = new NumGeneric<>();
        obj.getNum(123,12f);
        System.out.println("所输入数据为"+obj.getNum1());
        System.out.println("所输入数据为"+obj.getNum2());
    }
}

该程序的运行结果如下所示

所输入数据为123
所输入数据为12.0

自定义泛型方法

设置方式

使用方式在修饰符和返回值之间添加

public class GenericMethod {
    public<T >void printValue(T t){
        System.out.println(t);
    }

    public static void main(String[] args) {
        GenericMethod genericMethod = new GenericMethod();
        genericMethod.printValue("123");
        genericMethod.printValue(123);
    }
}

该程序的运行结果如下所示

123
123

联系之前做题
这边也可以对泛型进行限制

public<T extends Number>void printValue(T t)

其调用时传入参数只能为数值型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值