当前位置:首页 > 汽车

【ek】Java Jenerick t,e,k,v,n,和Object的区别和意义

通常我们在看一些源代码,全部是T,头晕的:sob:所以,掌握好泛型很重要!

什么是泛型?

Java泛型是JDK 5中引入的新功能,提供编译时间类型安全检测机制,使程序员能够在编译时检测错误的类型。

泛型的本质是参数化类型。也就是说,使用的数据类型被指定为参数。

泛型的优点是什么?写一个例子就一目了然了。

我要封装消息响应类。

public class result implements serial izable {

//响应代码

Integer code

//是否成功

Boolean success

//返回实体数据

用户用户用户;

Public result (integer code、boolean success、user user) {

=代码;

=success

=user

}

@Override

Public String toString() {

return“Result {”

代码='代码

,success=' success

,用户='用户

} ';

}

public static void main(string[]args){

User user=new User(1,' Tony ');

Resultresult=newresult (200,true,user);

市(result);

}

}

class user implements serial izable {

Integer id

字串名称;

公共用户(integer id、字符串名称){

=id

=name

}

@Override

Public String toString() {

Return 'User{ '

Id=' id

,name='' name '\ ' '

} ';

}

}

Result {code=200,success=true,user=user {id=1,name=' Tony'}}

过程结束了。退出代码0

休~那么这个反应体可以返回请求状态和用户信息。但是现在的需求也需要返回手机的信息。那么,需要封装能够返回手机信息的响应类。后面是衣服和鞋子.那不会累死吗?现在,泛型登场了。

public class resultt implements serial izable {

//响应代码

Integer code

//是否成功

Boolean success

//返回实体数据

T data

Public result (integer code、boolean success、tdata) {

=代码;

=success

=data

}

@Override

Public String toString() {

return“Result {”

代码='代码

,success=' success

,数据='数据

} ';

}

public static void main(string[]args){

User user=new User

(1, "Tony"); Result<User> resultUser = new Result<>(200, true, user); Sy(resultUser); Phone phone = new Phone, "Yellow"); Result<Phone> resultPhone = new Result<>(200, true, phone); Sy(resultPhone); } } class User implements Serializable { Integer id; String name; public User(Integer id, String name) { = id; = name; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + '}'; } } class Phone implements Serializable { Double price; String color; @Override public String toString() { return "Phone{" + "price=" + price + ", color='" + color + '\'' + '}'; } public Phone(Double price, String color) { = price; = color; } } Result{code=200, success=true, data=User{id=1, name='Tony'}} Result{code=200, success=true, data=Phone{price=999.99, color='Yellow'}} 进程已结束,退出代码0

可见,利用泛型,可以统一标识需要返回的实体类。不管你来什么类,我都可以给你塞进去!

第一次接触可能看不太明白,下面就详细讲解

泛型方法

你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。

语法规则

  • 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前

比如说这是一个用来打印数组的泛型方法:

private static <E> void printArray(E[] inputArray)
  • 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。

比如这个方法

private static <E,T> void printArray(E[] inputArray, T data)
  • 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
  • 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(int double char等)

泛型标记符

  • E Element 集合元素
  • T Type Java类
  • K Key 键
  • V Value 值
  • N number 数值类型
  • ? 表示不确定的Java类型

这些标记并不是限定只有对应的类型才能使用,即使你统一使用A-Z英文字母的其中一个,编译器也不会报错。之所以又不同的标记符,这是一种约定。在开发中很多规则都是一种约定,它能提高我们代码的可读性,方便团队见的合作开发

写个完整的例子:

public class TFunction { public static void main(String[] args) { // 创建各种类型的数组 Integer[] intArray = {1, 2, 3, 4, 5}; Double[] doubleArray = {1.1, 2.2, 3.3, 4.4}; Character[] charArray = {'H', 'E', 'L', 'L', 'O'}; Sy("整型数组元素为:"); printArray(intArray); // 传递一个整型数组 Sy("\n双精度型数组元素为:"); printArray(doubleArray); // 传递一个双精度型数组 Sy("\n字符型数组元素为:"); printArray(charArray); // 传递一个字符型数组 } // 泛型方法 private static <E> void printArray(E[] inputArray) { // 遍历打印数组 Arrays.stream(inputArray).forEach(e -> { Sy("%s ", e); }); Sy(); } }

泛型类

泛型类的声明与非泛型类几乎相同,唯一的不同在于类名的后面添加了参数声明部分

这边就不举例子了,因为开篇的例子就是封装了一个泛型类,当时不太理解的可以再回去看一下

类型通配符

我们一般可以使用?来承接所有的引用类型,搬运一个菜鸟上的例子:

public class GenericTest { public static void main(String[] args) { List<String> name = new ArrayList<String>(); List<Integer> age = new ArrayList<Integer>(); List<Number> number = new ArrayList<Number>(); name.add("icon"); age.add(18); number.add(314); getData(name); getData(age); getData(number); } public static void getData(List<?> data) { Sy("data :" + da(0)); } } data :icon data :18 data :314

?extends T

这是泛型上边界:只有T对象的子类可以被传入

如果是? extends C,那么只有D和E允许被传入,否则会编译报错

? super T

这是泛型下边界:只有T对象的父类可以被传入

如果是? super D,那么只有C和A允许被传入,否则会编译报错

T 和 ?

不知道看到这里,有没有疑惑。T和?好像作用差不多啊,有什么区别?

这里解释一下,T一般作为泛型参数,而?是更多是用来一个不确定的引用类型,意会一下吧~~~

T 和 Object

重头戏!!

知道的Object的同志都了解其是Java的超类(所有对象的父类),不了解的可以去看看我的博客,有做详细的解释。

那么问题就来了,Object好像可以代替泛型的功能啊!所有能用到泛型的地方Object都可以!

其实,在JDK5之前,都是用的Object,但其存在很多的问题,JDK5之后便引入了泛型

Object是所有类的父类,在编码过程中就难免出现类型转化问题,且在编译阶段不会报错,到了运行阶段才暴露问题,大大降低了程序的安全性和健壮性!

举例之前说一些转型的分类:

  • 向上转型 用父类声明一个子类对象 例如:Animal是Cat的父类,在声明时我们这么写:
Animal cat = new Cat();
  • 向下转型
  • 将父类对象强转为其子类实例:
Animal cat = new Cat(); Cat anotherCat = (Cat) cat;

所以当我们使用Object作为泛型来使用时,不仅写起来麻烦,还要不停的进行类型转化,还很容易出现问题,很逊的诶~

举个例子看看:

利用Object定义了一个数字变量,我们常识将其向下转型为Integer和String。将一个数字转型为字符串是一件荒唐的事情,可编译器并不能察觉这件事,直到程序运行了起来...

类型转换异常!!!

总结

泛型的出现,当类型转化出现问题的时候,在编译阶段就会暴露出来。解决了Object存在的诸多问题,让代码更加优雅,程序更加安全,更加健壮。

作者:不想起床的小张
链接:

1.《【ek】Java Jenerick t,e,k,v,n,和Object的区别和意义》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《【ek】Java Jenerick t,e,k,v,n,和Object的区别和意义》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/auto/3145417.html

上一篇

【同级别宝马奔驰奥迪哪个快】BBA半年大考“交卷”:宝马与奔驰缠斗,奥迪加速猛追丨壹观察

下一篇

【丰田跟奥迪哪个省油点高】丰田亚洲龙和奥迪A4L选择哪个?

【大众柯斯达报价】更便宜的大众德系SUV,量级差不多,性价比国产,斯柯达Korek

  • 【大众柯斯达报价】更便宜的大众德系SUV,量级差不多,性价比国产,斯柯达Korek
  • 【大众柯斯达报价】更便宜的大众德系SUV,量级差不多,性价比国产,斯柯达Korek
  • 【大众柯斯达报价】更便宜的大众德系SUV,量级差不多,性价比国产,斯柯达Korek

【ek】I9-12900K ROG STRIX Z690-E初始测试;与11900K相比有了显着改进

  • 【ek】I9-12900K ROG STRIX Z690-E初始测试;与11900K相比有了显着改进
  • 【ek】I9-12900K ROG STRIX Z690-E初始测试;与11900K相比有了显着改进
  • 【ek】I9-12900K ROG STRIX Z690-E初始测试;与11900K相比有了显着改进
【ek】白宫:希望加强与中国对话的直接

【ek】白宫:希望加强与中国对话的直接

ek相关介绍,白宫:希望加强与中国在广泛问题上的直接对话 当地时间3月22日,在美国白宫每日媒体简报会上,白宫新闻秘书普萨基表示,美国希望与中国就广泛问题加强直接对话。 白宫新闻秘书普崎(资料图) 普萨基表示,刚刚...

打印机怎么看型号端口看这里!电脑怎么安装POSTEK(博思得)打印机

打印机怎么看型号端口看这里!电脑怎么安装POSTEK(博思得)打印机

打印机怎么看型号端口相关介绍,POSTEK (Bostek)打印机的操作非常简单。主要分为耗材安装(碳标签)驱动安装和打印软件安装。我将详细说明具体的计算机安装Boster打印机步骤。 1. 首先插上打印机的电源线,按下电源开关 ...

【雪弗兰汽车价格】Chevan Seeker正式宣布搭载1.5T 4缸发动机,起步价有多合适?

  • 【雪弗兰汽车价格】Chevan Seeker正式宣布搭载1.5T 4缸发动机,起步价有多合适?
  • 【雪弗兰汽车价格】Chevan Seeker正式宣布搭载1.5T 4缸发动机,起步价有多合适?
  • 【雪弗兰汽车价格】Chevan Seeker正式宣布搭载1.5T 4缸发动机,起步价有多合适?
【ek】阅读市盈率(P/E)、peg、(P/B)和(ROE)

【ek】阅读市盈率(P/E)、peg、(P/B)和(ROE)

ek相关介绍,市盈率(P/E)也称为“价格收益比”,是每股价格与每股收益的比率。或者,如果我们估算股票的市盈率和每股收益,我们就可以“估算”股价。 公式1、市盈率=每股价格/每股收益(倍数) 公式2、每股价格=市盈...

生存进化代码怎么用?总结很全面速看!《方舟:生存进化》TEK代码一览 新TEK代码怎么玩

生存进化代码怎么用?总结很全面速看!《方舟:生存进化》TEK代码一览 新TEK代码怎么玩

生存进化代码怎么用相关介绍,《方舟:生存进化》新版本更新了TEK。新TEK怎么玩?这里带来了6399篇总结分享的TEK游戏攻略。一起看。 首先我们要开启所有蓝图 admincheat giveengraims 为什么要这样做呢?...

面包打印机怎么连续打印?总结很全面速看!postek标签打印机连续打印怎么设置

面包打印机怎么连续打印?总结很全面速看!postek标签打印机连续打印怎么设置

面包打印机怎么连续打印相关介绍,要使用Postek标签打印机打印标签,必须在计算机上安装该型号的打印机驱动程序,并安装标签编辑软件。 市面上有很多标签编辑软件,我就拿最常见的标签编辑软件Bartender来说。要打印标签需要先制作标...