美文网首页
Java 泛型

Java 泛型

作者: 极客天空 | 来源:发表于2020-04-18 21:59 被阅读0次

一 泛型概念

泛型,即“参数化类型” 将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式
在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段

二 泛型的类型

1.泛型类
泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map
class 类名称 <泛型标识:可以随便写任意标识号,标识指定的泛型的类型>{
private 泛型标识 /(成员变量类型)/ var;
.....
}
}
public class Generic<T>{
//key这个成员变量的类型为T,T的类型由外部指定
private T key;
public Generic(T key) { //泛型构造方法形参key的类型也为T,T的类型由外部指定
this.key = key;
}
public T getKey(){ //泛型方法getKey的返回值类型为T,T的类型由外部指定
return key;
}
}
2.泛型接口
//定义一个泛型接口
public interface Generator<T> {
public T next();
}
3.泛型通配符
public void showKeyValue1(Generic<?> obj){
Log.d("泛型测试","key value is " + obj.getKey());
}
4.泛型方法
public <T> T genericMethod(Class<T> tClass)throws InstantiationException ,
IllegalAccessException{
T instance = tClass.newInstance();
return instance;
}
泛型类,是在实例化类的时候指明泛型的具体类型;泛型方法,是在调用方法的时候指明泛型的具体类型

三 泛型机制有什么好处

1 类型安全
将运行时期出现的问题(ClassCastException),转移到编译时期。
使得代码更加可读,并且减少了出错机会。所有的强制转换都是自动和隐式的
2 提高性能
在泛型的实现中,编译器将强制类型转换插入生成的字节码中,但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来了可能

四 Java泛型实现原理:类型擦出

Java的泛型是伪泛型。在编译期间,所有的泛型信息都会被擦除掉。正确理解泛型概念的首要前提是理解类型擦出(type erasure)。
Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为类型擦除。

如在代码中定义的List<object>和List<String>等类型,在编译后都会变成List。JVM看到的只是List,而由泛型附加的类型信息对JVM来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法避免在运行时刻出现类型转换异常的情况。类型擦除也是Java的泛型实现方法与C++模版机制实现方式之间的重要区别。

五 类型擦除后保留的原始类型

原始类型(raw type)就是擦除去了泛型信息,最后在字节码中的类型变量的真正类型。无论何时定义一个泛型类型,相应的原始类型都会被自动地提供。类型变量被擦除(crased),并使用其限定类型(无限定的变量用Object)替换。

五 泛型的缺点

  1. 基本类型无法作为泛型实参
    比如 不能使用List<int> List<double> 只能使用 装箱类型 List<Integer> ArrayList<Double>
    这样就涉及到装箱与拆箱的开销
  2. 泛型类型无法作为方法重载
  3. 泛型类型无法作为真实类型使用
  4. 静态方法无法引用泛型参数(因为只有类实例化的时候才知道类型,但静态方法不需要类实例化)

为了避免 HashMap 的自动装箱行为,Android系统提供了 SparseBoolMap,SparseIntMap,SparseLongMap,LongSparseMap 等容器,可减少运行时间开支,减少内存使用

六 应用场景

面向对象编程及各种设计模式中有非常广泛的应用
通常是在集合框架中使用,遇到<>就要定义泛型
其实<>就是用来接收类型的,在使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。

Java 1.4 ——1.5 出现的泛型
1.Java泛型采用类型擦除实现
2.类型编译时被擦除为Objcet,不兼容基本类型
3.类型擦除的实现方案主要考虑后向兼容
4.泛型签名信息特定场景下反射可获取

相关文章

  • Java泛型教程

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

  • 第二十八课:泛型

    泛型出现之前 泛型出现之后 Java深度历险(五)——Java泛型

  • Kotlin 泛型

    说起 kotlin 的泛型,就离不开 java 的泛型,首先来看下 java 的泛型,当然比较熟悉 java 泛型...

  • java泛型中类型擦除的一些思考

    java泛型 java泛型介绍 java泛型的参数只可以代表类,不能代表个别对象。由于java泛型的类型参数之实际...

  • Java泛型

    参考:Java知识点总结(Java泛型) 自定义泛型类 自定义泛型接口 非泛型类中定义泛型方法 继承泛型类 通配符...

  • Java泛型—Java语法糖,只在编译有作用,编译后擦出泛型

    Java泛型—Java语法糖,只在编译有作用,编译后擦出泛型 在代码进入和离开的边界处,会处理泛型 Java泛型作...

  • JAVA 核心笔记 || [xxx] 泛型

    泛型 JAVA 的参数化类型 称为 泛型 泛型类的设计 Learn12.java 运行

  • 简单回顾Java泛型之-入门介绍

    什么时候开始有了Java泛型?什么是Java泛型?为什么要引入Java泛型?什么时候用到了泛型?可不可以给泛型下一...

  • Kotlin 泛型

    Kotlin 支持泛型, 语法和 Java 类似。例如,泛型类: 泛型函数: 类型变异 Java 的泛型中,最难理...

  • JAVA-泛型

    JAVA-泛型 sschrodinger 2018/11/15 简介 泛型是Java SE 1.5的新特性,泛型的...

网友评论

      本文标题:Java 泛型

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