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

java-泛型

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

java-泛型

泛型:当我们不知道用什么数据类型的时候,可以使用泛型.将泛型看成是一个变量,用来接收数据类型.

常用的泛型标识:T、E、K、V

一、泛型类

(1)如果定义的类使用了泛型,在创建对象的时候指定类型(不支持基本数据类型);

(2)当调用的时候没指定类型,则数据类型默认为Object类型.;

(3)泛型类在逻辑上可以看成是多个不同的类型,但是实际都是相同类型;

public class Generic {
    private T key;

    public T getKey() {
        return key;
    }

    public void setKey(T key) {
        this.key = key;
    }
}

二、泛型类的派生子类

(1)子类是泛型类,子类和父类泛型要保持一致

public class GenericSun extends Generic

(2)子类不是泛型类,泛型父类要指定类型

public class GenericSun extends Generic

三、泛型接口        
public interface 接口名称{}

(1)实现类不是泛型类,接口要明确数据类型

public class 类名称 implements 接口名称{}

(2)实现类是泛型类,接口泛型要和实现类泛型保持一致

// 在创建多态或对象的时候指定泛型的类型
public class 类名称 implements 接口名称{}

四、泛型方法

public  返回值类型 方法名(参数列表){  // 普通方法}


public static  返回值类型 方法名(参数列表){   // 静态方法}


public  E getAdd(E... e) {  // 泛型方法与可变参数}


public  E getAdd(E e) {return e;}


public  ArrayList getArrayList(ArrayList arrayList, K k) {
     return arrayList;
}

注意事项:

(1)public后面跟的<>表示声明此方法为泛型方法;

(2)参数列表中使用了几个泛型,<>内就指定几个泛型;

(3)在调用方法的时候指明泛型的具体类型;

(4)泛型类中的泛型方法,两者之间没有任何关系,即使泛型标识符相同;

五、类型通配符

使用场景:当使用泛型类或接口做参数传递的数据时,又或者创建带有泛型的对象,泛型类型不确定,可以通过表示。一但使用泛型统配符后,只能使用Object类中共性的方法,集合中元素自身无法使用.

例子:

public class Class1 {
    public static void main(String[] args) {
        ArrayList str = new ArrayList<>();
        str.add("qw");
        str.add("qw1");
        str.add("qw2");
        str.add("qw3");

        ArrayList in = new ArrayList<>();
        in.add(19);
        in.add(12);
        in.add(1921);
        in.add(191);
        in.add(1912);

        abb(str);
        abb(in);
    }

 public static void abb(ArrayList arr){
        Iterator in1 = arr.iterator();//这是一个多态
        while(in1.hasNext()){      //判断集合中是否有下一个元素
            Object obj = in1.next();   //in1.next属于包装类,Object又是祖宗类,这是一个多态
            System.out.println(obj);     //打印这个元素

        }

    }

}

六、类型通配符的上下限

建立场景

public class Animal {
}
public class Cat extends Animal{
}
public class MinCat extends Cat{
}


public class MaxCat extends Cat{
}

类型通配符的上限格式

类型名称 对象名称   //只能接收该类型及其子类

public class demo {

    public static void main(String[] args) {

        ArrayList animalArrayList = new ArrayList<>();
        ArrayList catArrayList = new ArrayList<>();
        ArrayList minCats = new ArrayList<>();
        showAnimal(catArrayList);
        showAnimal(minCats);
    }

    public static void showAnimal(ArrayList cats) {
        // 上限泛型不能向集合填充数据,如果传递过来的是MinCat,那么与MinCat平行的Cat的子类可以有无数个,这些子类都继承与Cat
        // cats.add(new Cat());
        // cats.add(new MinCat());
        // 数据遍历,使用多态
        for (Cat cat : cats) {
            System.out.println(cat);
        }
    }
}

类型通配符的下限格式

类型名称 对象名称  //只能接收该类型及其父类型

public class demo {

    public static void main(String[] args) {
        List list = new ArrayList<>();
        ArrayList animalArrayList = new ArrayList<>();
        ArrayList catArrayList = new ArrayList<>();
        ArrayList minCats = new ArrayList<>();
        showAnimal(catArrayList);
        showAnimal(animalArrayList);
    }
    public static void showAnimal(ArrayList cats) {
        // 可以填充Cat的子类
        cats.add(new Cat());
        cats.add(new MinCat());
        // 便利数据需要使用Object类型接收,因为类型最低为Cat
        for (Object cat : cats) {
            System.out.println(cat);
        }
    }
}

七、类型擦除

概念:泛型是Java 1.5版本才引进的概念,在这之前是没有泛型的,但是泛型代码能够很好地和之前版本的代码兼容。那是因为,泛型信息只存在于代码编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,我们称之为–类型擦除。

(1)无限制类型擦除

 (2)有限制类型擦除

(3)擦除方法中类型定义的参数

(4)桥接方法

八、泛型与数组

七、泛型和反射

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

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

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