*泛型入门篇*

1.什么是泛型

泛型:JDK1.5引入的特性,适用于很多类型。

2.引出泛型

Java强类型语言。定义一个变量时,必须定义其类型。

eg:

定义一个坐标类Point{                             坐标的x和y可能有以下三种数据类型
      x;                                        x = 10,y =20;//int
      y;                                        x = "东经108度",y = "北纬39度" //String                                                 
}                                               x = 10.3,y = 30.2; //double 

Object是Java中最高参数统一化,能接收所有的引用类型;有了包装类的自动拆箱之后,Object还能接受基本类型数值(自动拆箱)。--->Object可以接万物~

public class Pointer {
    private Object x;
    private Object y;
    
    public Object getX() {
        return x;
    }
    public void setX(Object x) {
        this.x = x;
    }
    public Object getY() {
        return y;
    }
    public void setY(Object y) {
        this.y = y;
    } 

    // 程序此时的要求是x和y在同一数据中是相同的类型
    public static void main(String[] args) {
        // 此时X和y都由用户进行输入
        // 第一组坐标类使用int来描述
        Pointer p1 = new Pointer();
        p1.setX(10);
        p1.setY(20);
        System.out.println("x = " + p1.getX() + ",y = " + p1.getY());
        // 第二组坐标类使用字符串来描述
        Pointer p2 = new Pointer();
        p2.setX("东经108度");
        p2.setY("北纬18度");
        System.out.println("x = " + p2.getX() + ",y = " + p2.getY());
    }
}


Object虽然可以接受所有类型,但是Object转为其他类型时都需要进行强制类型转换~          ***调用getX和getY方法时,需要根据具体的类型,将Object强转为具体的子类(隐藏的风险,这个风险是发生在运行阶段)

此时需要有一种新的机制,可以在定义类时,成员变量可以接收多种类型,但是在具体产生对象时明确类型,当有不同类型设置时,编译阶段就能发现错误。

JDK1.5引入时的泛型机制。所谓的泛型,就是我们在定义类或方法时,没有明确参数的类型,而是在使用该类时,明确类型。不需要进行类型强转,编译阶段就会在语法阶段检查类型是否匹配机制。类型的编译阶段守门员,不会让类型不匹配的问题进入到运行阶段!


 3.泛型类的使用

3.1 语法

语法:类名称 <类型参数>{
   类型参数 成员变量名称;
}

类型参数用大写的英文字母来代替。

根据泛型类,来产生泛型对象!

泛型在定义时,可以不明确成员变量的类型,但是在产生对象时,必须明确类型。

Point<Integer> p = new Point<>();
泛型类<明确类型> 引用名称 = new 泛型类名称<>():
此时产生的是Integer类型的Point对象,所以X和y就会被定义为整型

 


 3.2泛型类使用多个类型参数

假设x和y为不同类型时,可以使用多个类型参数~~~

泛型类名称<类型参数1,类型参数2,...>{
       类型参数1,变量x;
       类型参数2,变量y;
       // ...依此类推
}
public class newPoint<T,E>{
    pricate T x;
    private E y;
}

 eg:产生newPoint对象,x和y就可以为不同的类型(也可以为相同类型)

public class NewPoint<T,E> {
    private T x;
    private E y;

    public T getX() {
        return x;
    }

    public void setX(T x) {
        this.x = x;
    }

    public E getY() {
        return y;
    }

    public void setY(E y) {
        this.y = y;
    }

    public static void main(String[] args) {
        // JDK中的泛型类,以Map集合为例
        Map<Integer,String> map = new HashMap<>();

        // 相同类型
        NewPoint<Integer,Integer> p = new NewPoint<>();
        p.setX(10);
        p.setY(20);
        // 不同类型
        NewPoint<Integer,String> p = new NewPoint<>();
        p.setX(10);
        p.setY("东经10度");
    }
}

总结:一般使用多个大写的字母来定义类型参数

T =》 一般指代任何类

E =》 一般代表元素Element和T意义差不多,也有使用E来指代异常的意思

身份证号,姓名: K和V一般搭配使用,描述一个键值对的对象,

K =》 key的意思,不重复的键值

V =》value的意思,可以重复


3.3 泛型方法

泛型不仅可以定义类,还可以单独定义方法。

语法: 权限修饰符 <类型参数> 方法返回值类型 方法名称(类型参数 型参名称){}


4. 泛型注意点:

这三个问题的本质就在于泛型只存在于编译阶段,运行阶段没有泛型~~(类型擦除)

4.1 泛型只能用在成员域,不能用在静态域(static修饰的内容不能使用泛型)。

因为没有对象就没有泛型。

4.2 产生泛型对象时,具体的类型不能使用基本数据类型,要用基本类型的话统一使用包装类。

4.3 不能直接创建和实例化泛型数组,要使用泛型数组,统一使用Object数组。

进入JVM之后就没有任何泛型相关的信息,E,T都没有,new的话在运行阶段JVM时开辟空间~~JVM都不知道E和T是啥东西,所以不呢直接new泛型数组。


 5.类型擦除

类型擦除:泛型信息只存在于编译阶段,在进入JVM之前,与泛型有关的所有信息会被编译器擦除掉,专业术语称为 "类型擦除"。

通俗来说:也就是泛型和普通类在进入JVM之后,都一样,就没有泛型类了,就没有泛型这个东西了~~

 


 6.正确使用泛型数组的方式

要使用泛型数组,统一定义为Object数组,然后在CURD(增删改查数组时,使用泛型)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹿小伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值