当前位置: 首页 > news >正文

Java泛型使用及局限

Java泛型的局限和使用经验

泛型的局限

  1. 任何基本类型不能作为类型参数

经过类型擦除后,List中包含的实际上还是Object的域,而在Java类型系统中Object和基本类型是两套体系,需要通过“自动装包、拆包机制”来进行交互。

2.任何在运行时需要知道确切类型信息的操作都无法工作。

由于Java的泛型是编译期泛型(在进入运行时后没有泛型的概念),因此运行时的类型转换和类型判定等操作都没有效果。

3.冲突1:方法名一样,参数列表是同一个类型参数的两个泛型方法,重载将产生相同的函数签名;

在泛型擦除后,这两个方法签名完全相同,产生冲突;

4.冲突2:使用泛型接口时,需要避免重复实现同一个接口

5.不能在静态域或方法中引用类型参数

在方法的签名里多了一个static关键字,然后引发编译错误的原因就变成了:在静态域中无法引用类型变量

泛型的常用经验

  1. 尽量消除异常,初学者容易写出使用原生类型的代码,或者使用泛型不当的代码,现在编辑器非常先进,尽量消除提示的异常;对于开发者自己确认不需要消除切可以工作的代码,可以使用@SuppressWarnings("unchecked")屏蔽掉异常;
  2. 能用泛型类(或接口)的时候尽量使用;能用泛型方法的时候尽量使用泛型方法;
  3. 定义API时,尽量使用泛型;


 泛型的概述
泛型:参数化类型

类型形参:<T>,<E>,<K>,<V>,<U>,<R>。。。。

类型实参:必须是引用数据类型,不能是基本数据类型

       <String>,<Integer>,<Student>,<ArrayList<String>>……

形式一:泛型类与泛型接口
1、声明语法格式:

【修饰符】 class 类名/接口<类型形参列表>{   
 
}​
 
【修饰符】 class 类名/接口<类型形参1 extends 父类上限>{   
 
}
 
【修饰符】 class 类名/接口<类型形参1 extends 父类上限 & 父接口上限>{   
 
}
在类名或接口名后面声明的泛型形参类型,可以在当前类或接口中使用,用作声明成员变量、方法的形参、方法的返回值。

但是不能用于静态成员上

2、使用语法格式

在(1)创建泛型类、泛型接口的对象时,为泛型形参指定具体类型

       (2)在继承泛型类或实现泛型接口时,为泛型形参指定具体类型

示例代码

ArrayList<String> list = new ArrayList<String>();
 
ArrayList<String> list = new ArrayList<>();//JDK1.7之后可以省略
 
​class MyStringArrayList extends ArrayList<String>{
 
}​
 
class Employee implements Comparable<Employee>{
 
   public int compareTo(Employee e){       
 
  }
 
}​
 
Arrays.sort(数组,  new  Comparator<泛型实参>(){
 
   public int compare(泛型实参类型  o1, 泛型实参类型  o2){       
 
  }
 
});

3、泛型如果没有指定,会被擦除,按照最左边的上限处理,如果没有指定上限,按照Object处理

形式二:泛型方法
1、声明的语法格式

【修饰符】 <泛型形参列表> 返回值类型 方法名(【数据形参列表】)【throws 异常列表】{}

【修饰符】 <泛型形参 extends 父类上限 & 父接口上限> 返回值类型 方法名(【数据形参列表】)【throws 异常列表】{}
(1)在方法返回值类型前面声明的泛型形参类型,只能在当前方法中使用,用于表示形参的类型或返回值类型,或方法局部变量的类型,和别的方法无关。

(2)泛型方法可以是静态方法,也可以是非静态方法

2、 使用

当调用方法,会根据具体的数据的实参的类型,来确定泛型实参的类型。

通配符?
(1)?:代表任意引用数据类型

(2)? extends 上限:代表上限本身或它的子类

(3)? super 下限:代表下限本身或它的父类

例如:

ArrayList<?>:表示可以接受任意类型

ArrayList<?> list = new ArrayList<String>();
 
ArrayList<?> list = new ArrayList<Integer>();
 
ArrayList<?> list = new ArrayList<Animal>();
ArrayList<? extends 上限>:

ArrayList<? extends Person> list = new ArrayList<Person>();
 
ArrayList<? extends Person> list = new ArrayList<Animal>();//Animal不行,因为Animal是父类
 
ArrayList<? extends Person> list = new ArrayList<Student>();
 
ArrayList<? extends Person> list = new ArrayList<Dog>();//Dog也不行
ArrayList<? super 下限>:

ArrayList<? super Person> list = new ArrayList<Person>();
 
ArrayList<? super Person> list = new ArrayList<Animal>();
 
ArrayList<? super Person> list = new ArrayList<Student>();//Student,因为Student是子类
 
ArrayList<? super Person> list = new ArrayList<Dog>();//Dog也不行
ArrayList<?>:不能添加元素,除了null

ArrayList<? extends 上限>:不能添加元素,除了null

ArrayList<? super 下限>:可以添加下限或下限子类的对象

 Collections工具类
java.util.Collections:工具类,操作集合

(1)public static <T> boolean addAll(Collection<? super T> c, T... elements)

添加elements的几个对象到c集合中。T是elements对象的类型,要求Collection集合的元素类型必须是T或T的父类

(2)public static <T> int binarySearch(List<? extends Comparable<? super T>> list,T key)

在list集合中用二分查找key的下标,如果存在返回的是合理的下标,如果不存在返回的是一个负数下标

T是元素的类型,

<? extends Comparable<? super T>>,要求集合的元素必须实现Comparable接口

<? super T>,在实现Comparable接口,可以指定Comparable<类型实参>为T或T的父类。

(3)public static boolean disjoint(Collection<?> c1, Collection<?> c2)

判断c1和c2没有交集就为true

(4)public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)

求coll集合中最大元素

<T extends Object & Comparable<? super T>>:要求T或T的父类实现Comparable接口

(5)public static <T extends Comparable<? super T>> void sort(List<T> list) 给list集合排序

<T extends Comparable<? super T>>:要求T或T的父类实现Comparable接口

(6)public static <T> Collection<T> synchronizedCollection(Collection<T> c)

以synchronizedXX开头的方法,表示把某种非线程安全集合转为一个线程安全的集合。

(7)public static <T> List<T> unmodifiableList(List<? extends T> list)

http://www.lryc.cn/news/317059.html

相关文章:

  • Sklearn线性回归
  • APP中互联网公司的必备知识
  • 论文翻译 - Visual Adversarial Examples Jailbreak Large Language Models
  • android so载入过程
  • FlowerShop花店管理系统wpf+sqlserver
  • 如何在群晖NAS部署WPS容器并实现无公网IP远程访问本地office软件
  • 【C语言程序设计】C语言求圆周率π(三种方法)
  • 常见的特殊端口号及其用途
  • Linux(ubuntu) 安装kotlin
  • 微信小程序提交成功设置提示
  • Pycharm与Anaconda安装
  • 阿里云数据盘挂载目录
  • 【Python】探索PyPinyin 库:Python 中的中文拼音转换工具
  • Linux运维总结:Centos7.6之OpenSSH7.4升级版本至9.3
  • SD-WAN能解决企业网络的哪些问题?
  • Python实战:Python集合的常见操作
  • Linux: cloud: network: tap tx 丢包一例,vCPU的运行受到主机CPU的占用影响
  • 揭秘数据之美:利用 Bokeh 轻松构建实时、动态的数据可视化项目
  • 性能测试场景分析并设计?超细案例讲解
  • python面向对象练习一
  • 【Linux-tar/gzip/zip】
  • 第一代高通S7和S7 Pro音频平台:超旗舰性能,全面革新音频体验
  • el-menu + el-badge 菜单加红点标识el-badge
  • python: inspect模块各函数的用法
  • 优化代码性能:C#中轻松测量执行时间
  • I2C学习总结
  • libcudart.so libcuda.so之间的关系
  • STM32基本定时功能
  • Linux学习:权限
  • 汉诺塔问题代码写法的详细解析