约定俗成的力量--java中泛型的意义和用法

1、泛型的定义

泛型是指通过在定义类、接口或者方法时,使用类型参数,来表示未指定的类型,从而使得代码在保持强类型检查时,具备高度的通用性。泛型在不同的编程语言中各有不同的特征。在java中,经常会遇到代码如

java 复制代码
List<String> codes;

Map<String,Interger> hight;

的代码,这便是泛型的使用示例。

2、java中的泛型

在Java中,泛型类型参数的实际类型会在编译时被清除掉,这被称为类型擦除。因此,在运行时是无法得知其类型参数的的类型的,而且也无法直接使用基本值类型作为泛型类型参数。Java编译程序在编译泛型时会自动加入类型转换的编码,故运行速度不会因为使用泛型而加快。

你是否遇到过这样的代码

java 复制代码
List userList = new ArrayList();

userListt.add("liming");

userList.add(18);

这段代码在编译时没有任何问题。但是,你如果获取List中的元素

java 复制代码
String age = (String)userList.get(1); //ClassCastException

虽然在list写入值时没有指定任何类型,但是在获取时,却抛出异常。如何避免这种隐藏BUG?java提供的泛型便能轻松应对这个问题,在定义时便声明参数类型,如

java 复制代码
List<String> user = new ArrarList();

3、java中泛型的优势

Java中泛型使用,主要有三方面的优势

  1. 类型安全,编译期间便可发现问题
  2. 去除类型转换,你再无需使用(Stirng)来进行转换
  3. 意图明确,代码逻辑更加清晰可读

4、T、E、K、V是什么?

在阅读java源码或者你自己编写程序时,是否见过或遇到过诸如T、E、K、V这样的泛型定义?他们代表什么意义呢?首先你要明确,T、E、K、V 这些并不是java的关键字,另外他们也不是什么特殊的语法,他们只是一些名字,一些被严格遵守的惯例而已。

4.1、T是什么?

那么T是什么意思呢?

T是Type的首字母,表示这是一个通用的类型。如代码

java 复制代码
class Desk<T> {
    private T value;

public void put(T value) {
        this.value = value;
    }
    public T get() {
        return value;
    }
}

在使用这个类时,你可以

java 复制代码
Desk<String> desk = new Desk<>();

desk.put("yingyu");

4.2、E是什么

E是Element的首字母,表示元素。在jdk源码实现的Set定义中,使用了这样的代码

java 复制代码
public interface Set<E> extends Collection<E>

其中的E表示该集合可以维护的元素类型。

4.3、K和V呢?

K是Key的首字母,通常在map集合中最为常见,并且K和V通常是成对出现,V即为Value的首字母,所以K一般表示键,V表示值。在集合Map定义时,使用代码

java 复制代码
Map<String,Integer> user;

其实,无论是T E K V这些都是一些约定俗成的使用习惯,正如我们在写for循环时定义的变量i j k等,如果我们将循环中的i定义时写作count,无论从语法还是功能逻辑上,均是没有任何问题的。

相关推荐
CHANG_THE_WORLD3 小时前
<Fluent Python > Unicode 文本与字节
开发语言·python
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题】【Java基础篇】第20题:HashMap在计算index的时候,为什么要对数组长度做减1操作
java·开发语言·数据结构·后端·面试·哈希算法·hash-index
凯瑟琳.奥古斯特3 小时前
Bootstrap快速上手指南
开发语言·前端·css·bootstrap·html
嵌入式×边缘AI:打怪升级日志3 小时前
嵌入式Linux开发(了解交叉编译工具链的组成)
java·linux·运维
FreeGo~3 小时前
Linux 系统编程 进程篇 (五)
java·linux·服务器
我就是妖怪3 小时前
Kimi K2.6 智能效果实测与能力全景展示
开发语言
中二痞3 小时前
下载Python 版本,环境变量变更以及PyCharm更换python版本
开发语言·python·pycharm
故事和你913 小时前
洛谷-算法2-3-分治与倍增5
开发语言·数据结构·c++·算法·动态规划·图论
SilentSamsara3 小时前
标准库精讲:collections/itertools/functools/pathlib 实战
开发语言·vscode·python·青少年编程·pycharm
逻辑驱动的ken3 小时前
Java高频面试考点场景题17
开发语言·jvm·面试·求职招聘·春招