美文网首页
Java基础篇-泛型

Java基础篇-泛型

作者: mg驿站 | 来源:发表于2020-05-28 23:58 被阅读0次

泛型在日常编码过程中经常用到,常用容器List、Set、Map都是支持泛型的,具体怎么使用泛型呢,一起来看下这几个问题。

       1、为什么要使用泛型

       2、泛型使用过程中有哪些限制

       3、为什么说java没有实现真正的泛型

一、泛型的定义和设计背景

泛型是JDK5以后出现的特性,即参数化类型,将具体的类型参数化,即在对象创建或者方法调用时才会明确类型。

使用泛型有什么好处呢,看下如下代码:

List list = new ArrayList();

list.add(new Object());

list.add(new Object());

String str = (String) list.get(0);

List没有定义泛型类型,取出String的时候需要做强制类型转换,编译期间是没有问题的,那运行下这段代码会报这个错误

使用泛型就能解决这个问题,在编译期间就只能使用指定类型。

泛型具体有什么好处呢

1、解决类型安全问题,在编译期间就解决强制类型转换的问题

2、减少强制类型转换,提高代码效率(java中没有真的实现泛型,编译后的代码还是强制类型转换)

3、在框架和公共类设计的时候提高代码的复用性

二、应用场景

       1、泛型类,类的泛型类型,需要实例化对象时指定

public class Demo2<T,M> {

private  T t;

private M m;

public void setValue(T t,M m)

{

    this.t= t;this.m = m;

}

public T getT()

{

    return t;

}

public static void main(String[] args) {

 Demo2<Integer,String> demo2 = new Demo2<>();

demo2.setValue(1,"1");

Integer no =demo2.getT();

System.out.println(no);

}

}

2、泛型接口,接口的泛型可以在继承的时候指定,也可以在实例化对象是指定

public interface Demo3<T> {

T getT();

}

在继承时指定,如下代码

public class Demo4 implements Demo3{

@Override

public String getT() {

return null;

}

}

在实例化时指定,代码如下

public class Demo5<T> implements Demo3<T> {

@Override

public T getT() {

return null;

}

public static void main(String[] args) {

        Demo5 demo5 =new Demo5<>();

}

}

3、在方法中使用泛型

public class Demo6 {

public <T> T getT(T t)

{

return t;

}

public <M> void show(M m)

{

        System.out.println(m);

}

public static void main(String[] args) {

Demo6 demo6 =new Demo6();

Integer no = demo6.getT(1);

String str = demo6.getT("mg");

demo6.<String>show("mg");

}

}

4、静态方法中使用泛型

静态方法中也是可以使用泛型的,不过不能用类的泛型方法修饰静态方法

public class Demo7 {

public static <T> void getT(T t){

System.out.println(t);

}

public static void main(String[] args) {

Demo7.getT("1");

}

}

5、泛型集合

ArrayList<String> list = new ArrayList<>();

三、通配符的使用

使用泛型过程中需要限定泛型的类型怎么处理呢,使用通配符

< ? extends E>上界通配符,即指定的泛型类型只能是E和E的子类

< ? superE>下界通配符,即指定的泛型类型只能是E和E的父类

具体怎么使用呢,先定义三个POJO类

public class Grandpa {}

public class Father extends Grandpa {}

public class Son extends Father {}

上界限定符

使用上界限定符实现泛型的向上转换,尝试如下代码

public class Demo8<T extends Father> {

public static void main(String[] args) {

Demo8 demo8 =new Demo8<>();

Demo8<Father> demo81 = new Demo8<>();

Demo8<Grandpa> demo82 = new Demo8();

}

}

其中Son和Father可以编译通过,Grandpa会报错,Demo8能限定只能使用Father和子类做泛型类

下界限定符

使用下界限定符表示修饰的类型必须是父类,尝试如下代码

public class Demo9{

public void setList(List<? super Father> list){}

public static void main(String[]args){

Demo9 demo9 =new Demo9();

demo9.setList(new ArrayList<Grandpa>());

demo9.setList(new ArrayList<Son>());

}

}

四、泛型注意事项

1、泛型类型只能是引用类型

2、可以指定多个泛型类型

3、静态方法不能用类的泛型修饰

4、泛型创建具体类型的数组

5、泛型使用过程中,思想即不需要知道泛型类型,所以尽量避免使用反射,如果确实需要参数类型,可以通过在方法中定义Class<T>参数,在使用反射,如下代码

public <T> void setT(T t,Class<T> cl){}

五、伪泛型之类型擦除

Demo9去掉demo9.setList(new ArrayList<Son>());这行代码,能正常编译以后,反编译一下class文件代码如下

public class Demo9 {

  public voidsetList(List<? super Father> list) {}

  public static void main(String[] args) {

    Demo9 demo9=newDemo9();

   demo9.setList(new ArrayList<>());

  }

}

demo9.setList(new ArrayList<>());代码中的类型没有了,这是为什么呢。

JDK5之前是没有实现泛型,为了兼容以前的版本,在编译过程中做了类型擦除实现的是伪泛型,如果是<T>这种类型的,会处理成Object,如果使用了上界限定符<?extends T>就会转成上界T。

所以说java中泛型的使用主要是为了类型安全

相关代码提取位置

链接:https://pan.baidu.com/s/1VU9tNHnEo0niglPbdcOjww

提取码:n128

相关文章

  • Android中泛型的应用(二)

    背景感谢并参考[怪盗kidou]的《搞定Gson泛型封装》 。上一篇《 Java基础--Android中泛型的应用...

  • 泛型程序设计

    (Java基础篇都是根据《Java核心技术 卷I》再进行自己的总结归纳和思考写出的) 泛型是什么? 泛型字面上就是...

  • Java 泛型

    导读 移动开发知识体系总章(Java基础、Android、Flutter) 为什么会有泛型? 泛型类 泛型方法 泛...

  • Java基础篇-泛型

    泛型在日常编码过程中经常用到,常用容器List、Set、Map都是支持泛型的,具体怎么使用泛型呢,一起来看下这几个...

  • 【Java基础】- 泛型篇

    简介 说起各种高级语言,不得不谈泛型,当我们在使用java集合的时候,会发现集合有个缺点:把一个对象“丢进”集合之...

  • Java泛型 --(1)泛型基础篇

    主要内容 (1)能够定义简单的泛型类、泛型方法(2)知晓类型变量的限定规则和应用(3)理解虚拟机是如何解析泛型代码...

  • 通配符的上下限与泛型方法

    java零基础入门-高级特性篇(七) 泛型 下 本章阅读有难度,请谨慎阅读,如有不适,可以跳过。 本章继续讲解泛型...

  • Android 知识体系整理

    基础的知识点全部略过,下面都为进阶知识点 Java 篇 1. 泛型 熟练掌握泛型语法是在java开发中涉及到的架构...

  • Java泛型教程

    Java泛型教程导航 Java 泛型概述 Java泛型环境设置 Java泛型通用类 Java泛型类型参数命名约定 ...

  • Kotlin 泛型 VS Java 泛型

    建议先阅读我的上一篇文章 -- Java 泛型 和 Java 泛型一样,Kotlin 泛型也是 Kotlin 语言...

网友评论

      本文标题:Java基础篇-泛型

      本文链接:https://www.haomeiwen.com/subject/bpdtzhtx.html