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

java泛型

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

java泛型

1、概述

(1)泛型的目的是使数据的类型参数化

(2)定义泛型时不需要指定确定的数据类型,在真正的使用时才指定真正的类型

(3)核心目标:解决容器类型在编译时安全检查的问题

2、泛型类

(1)泛型类的基本形式

 (2)泛型参数不支持基本数据类型,典型的如容器集合类不支持基本数据类型

(3)泛型中的类型在编译时就会被确定,因此在运行时是不会有泛型的信息的
 

package generic;

public class GenericDemo {
    private  T member;

    public GenericDemo(T m){
        this.member=m;
    }

    public T printAndReturn(){
        System.out.println(member);
        return member;
    }

    //泛型类中允许普通的方法
    public void sayHello(){
        System.out.println("hello");
    }
}
package generic;

public class GenericTest {
    public static void main(String[] args) {
        GenericDemo integerGenericDemo=new GenericDemo(10);
        integerGenericDemo.printAndReturn();
        GenericDemo stringGenericDemo=new GenericDemo("hello");
        integerGenericDemo.printAndReturn();
        //泛型的参数虽然的参数不同,但他们是相同的类
        System.out.println(integerGenericDemo.getClass());
        System.out.println(stringGenericDemo.getClass());
        System.out.println(stringGenericDemo.getClass()==stringGenericDemo.getClass());
    }
}
10
class generic.GenericDemo
class generic.GenericDemo
true

Process finished with exit code 0

编译后的class文件中是不包含泛型的信息的

 (4)泛型类中泛型的数据类型是严格定义的,如图print函数要求传入GenericDemo类型的数据当此时传入Number的子类型数据,编译器会直接报错

 (5)通配符的使用

a、直接使用?通配符,如图所示将Number修改为?,编译器不再报错,但这种修改方法是不合理的因为如果此时传入GenericDemo 对象,由于编译器不检查能够编译成功,但是在运行中会因为强制类型转化而发生错误。

 b、给泛型加入上边界,通过GenericDemo<? extends Number>来表示泛型的数据类型必须是继承自Number类型,这样既可以保证GenericDemo不会出错,也能保证Generic无法作为参数传入。

 c、给泛型加入下边界,GenericDemo<? super Integer>可以设置泛型的下边界,只有泛型的类型为Integer的父类,在编译器检查时才不会报错。

 3、泛型接口

(1)既可以通过泛型类来实现泛型接口也可以通过具体的类来实现泛型接口

package generic;

public interface GenericInterface {
    public K getK();
    public V getV();
}

 a、泛型类实现泛型接口,表示类型的字母必须相同

package generic;

public class GenericImp implements GenericInterface {
    @Override
    public K getK() {
        return null;
    }

    @Override
    public V getV() {
        return null;
    }
}

b、具体的类实现泛型接口,但此时implements后接口的类型也必须是对应的具体类型

package generic;

public class GenericImp implements GenericInterface {
    @Override
    public Integer getK() {
        return null;
    }

    @Override
    public String getV() {
        return null;
    }
}

4、泛型方法

(1)泛型方法既可以定义在泛型的类和接口里,也可以定义在普通的类和接口里,下列代码中

泛型类GenricDemo中的T和泛型方法public void printEArray(T[] array)中的T是没有关联的可以为两种不同的具体类,即泛型类中的泛型方法是独立的

package generic;

public class GenericDemo {
    public  T member;

    public GenericDemo(T m){
        this.member=m;
    }

    public T printAndReturn(){
        System.out.println(member);
        return member;
    }
    
    //这里定义的T可以与上面的T不同
    public  void printEArray(T[] array){
        for (T e:array) {
            System.out.println(e);
        }
    }
}
package generic;

public class GenericTest {

    public static void main(String[] args) {
        GenericDemo integerGenericDemo=new GenericDemo(10);
        integerGenericDemo.printAndReturn();
        String[] strings=new String[]{"aaaa","bbbb","cccc"};
        integerGenericDemo.printEArray(strings);
    }
}

5、泛型字母的含义

(1)E : Element,表示集合中的元素

(2)T:Type,表示java类

(3)K:Key,表示键

(4)V:Value,表示值

(3)N:number,表示数字类型,如Integer,Double等

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

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

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