栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 泛型

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 泛型

Java 泛型

泛型回顾泛型类泛型类派生子类泛型接口通配符 , 上边界 ,下边界

泛型通配符通配符上限通配符下限 类型擦除

Java 泛型(generics)是 JDK 5 中引入的一个新特性.

泛型提供了编译时类型安全检测机制,好处是能够在编译的时候就检查类型安全.

使用Object可以接收任意类型的参数,但是存在类型转换的问题.泛型可以解决它.

泛型的参数只能是引用类型(类)

泛型的类型参数可以有多个

没有定义具体类型,默认为Object

泛型回顾

在学习JavaSE中的集合Collection时,以及自定义数组/链表/二叉树的元素类型时使用过泛型

集合中

//ArrayList源码  
public class ArrayList extends AbstractList
        implements List, RandomAccess, Cloneable, java.io.Serializable
{
 transient Object[] elementData; // Object类型数组,可以接收任何引用类型
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();

自定义类中

public class MyselfArray {
	//数组当前元素个数
    private int size;

    //泛型数组
    private T[] data;
    
    //构造方法
    
    //数组其他方法
}

泛型是为了解决Object接收任意类型存在类型转换的隐患.

泛型类

泛型类: 泛型类型用于类的定义中

通过泛型可以完成对一组类的操作对外开放相同的接口

普通的泛型类

public class Demo {
    //name的类型为泛型,由外部指定
    private T name;

    public T getName() {
        return name;
    }

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

传入的实参类型需与泛型的参数类型相同

Demo demo = new Demo(123456);
泛型类派生子类

Demo做为父类

public class Demo 

若子类也是泛型类,子类和父类的泛型类型要一致

public class DemoChild extends Demo 

若子类不是泛型类,父类要明确数据类型

public class Demo1Child extends Demo

泛型接口

泛型接口与泛型类的定义和使用基本相同.

定义一个泛型接口

@FunctionalInterface//功能接口,只能有一个方法
public interface GenericInterface {
    void show();
}

泛型类实现泛型接口,子类和接口的泛型类型要一致

public class DemoChild extends Demo implements GenericInterface{
    @Override
    public void show() {

    }
}

普通类实现泛型接口,接口要明确泛型的类型

public class Demo1Child extends Demo implements GenericInterface{
    @Override
    public void show() {
        
    }
}
通配符 , 上边界 ,下边界 泛型通配符

类型通配符一般使用 ? 代替具体的类型实参.

//  ?  通配符  表示实际传入的参数可以是任意的
public static void test(Demo demo){
    System.out.println(demo.toString());
}
//  ?   可以传任意类型
Demo demo = new Demo<>();
Demo demo0 = new Demo<>();
test(demo);//String
test(demo0);//Integer
通配符上限

类 / 接口

要求该泛型的类型,只能是实参类型或是参类型的子类类型

	//  类型通配符上限
    //该泛型的类型只能是  目标类型  及目标类型的   子类类型
    public static void test1(Demo demo){
        System.out.println(demo.toString());
    }
    //上限为Number  可以传Number和子类  Integer Float...
    Demo demo1 = new Demo<>();
    test1(demo1);//上限
    Demo demo2 = new Demo<>();
    test1(demo2);//上限
通配符下限

类 / 接口

要求该泛型的类型,只能说是实参类型或实参类型的父类类型

	//    类型通配符下限
    该泛型的类型只能是  目标类型  及目标类型的   父类类型
    public static void test2(Demo demo){
        System.out.println(demo.toString());
	//下限为Integer 可以传Integer 及 父类Number 超类Object
    Demo demo3 = new Demo<>();
    test2(demo3);
    Demo demo4 = new Demo<>();
    test2(demo4);
    Demo demo5 = new Demo<>();
    test2(demo5);
 
类型擦除 

泛型是Java 1.5 引入的概念,在之前没有泛型.但是泛型代码却能够和之前版本代码兼容,因为信息只存在于编译阶段,在进入JVM之前==,与泛型相关的的信息会被擦除掉==,称为类型擦除

package com.ffyc.forword.generic;

import java.lang.reflect.Field;

public class Demo {
    //name的类型为泛型,由外部指定
    private T name;

    public T getName() {
        return name;
    }

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

    
    public static void main(String[] args) throws NoSuchFieldException {
        Demo demo = new Demo<>();
        demo.setName("jim");
        Field field = demo.getClass().getDeclaredField("name");
        System.out.println(field.getName()+"  type:"+field.getType());
    }
}


可以看到在运行时,泛型被转为了Object类型

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号