引言

我们使用object和泛型做形参,都是为了让这个方法能接收更多类型的对象,让程序变得更健壮,代码复用率更高。当我们回看自己写的代码时会发现,好像使用泛型的地方使用object也可以,使用object的地方使用泛型同样能实现,那么,本文就说一下,泛型和object的却别

正题

先上举例来说明一下object和泛型的使用场景吧,有这样一个需求:写一个数字排序的算法,我们知道java中的数字类型有Double、Float、Byte、Short、Integer 以及 Long。

方法一:每种数字类型写一个方法,需要写6个方法

class Sort {
    void sort(Integer[] sort) {
        // 排序
    }     void sort(Double[] sort) {
        // 排序
    }
}

方法二:使用object,只需要写一个方法。

class Sort {
void sort(Object[] sort) {
Number[] numbers = (Number[]) sort;
// 排序
}
}

方法三:使用泛型

class Sort {
<T> void sort(T[] sort) {
Number[] numbers = (Number[]) sort;
// 排序
}
}

好了,开始测试

public static void main(String[] args) {
Test t=new Test();
t.sort(new Integer[]{2,3}); t.sort1(new Integer[]{2,3}); }
<T> void sort(T[] sort) {
Number[] numbers = (Number[]) sort;
}
void sort1(Object[] sort) {
Number[] numbers = (Number[]) sort;
// 排序
}

编译没毛病,运行也不会有毛病,别急我们再写一个列子

public static void main(String[] args) {
Test t=new Test();
t.sort(new String[]{"a","b"}); t.sort1(new String[]{"a","b"}); }
<T> void sort(T[] sort) {
Number[] numbers = (Number[]) sort;
//排序
}
void sort1(Object[] sort) {
Number[] numbers = (Number[]) sort;
// 排序
}

编译没毛病,运行一下:

我们最头疼的就是这种运行时的错误了,在大型项目中都需要编译好后部署然后运行,所以大家都希望问题在编译期就暴露出来,不要等到运行时才发现问题,那么问题来了有没有一种写法能够让他在编译器发现问题呢?看下面这个例子

class Sort {
<T extends Number> void sort(T[] sort) {
Number[] numbers = (Number[]) sort;
// 排序
}
}

测试代码

显然使用T extends这中写法能让问题在编译期暴露

问题的解决方法有了,总结一下

1、使用object作为形参当需要进行类型强制转换时,编译期不会检查类型是否安全,运行期才会检查

2、泛型写法范型的指定保证了代码的健壮性,避免了强转的风险.

完毕

结后语

我相信大家在写这个算法时选形参的类型时,大部分猿都不会选object,而选Number,是的选Number做形参,一切问题都扫除了,但是本文只讨论泛型的优点

java 泛型和object比较的更多相关文章

  1. Java泛型学习笔记--Java泛型和C#泛型比较学习(一)

    总结Java的泛型前,先简单的介绍下C#的泛型,通过对比,比较学习Java泛型的目的和设计意图.C#泛型是C#语言2.0和通用语言运行时(CLR)同时支持的一个特性(这一点是导致C#泛型和Java泛型 ...

  2. 基础篇:深入解析JAVA泛型和Type类型体系

    目录 1 JAVA的Type类型体系 2 泛型的概念 3 泛型类和泛型方法的示例 4 类型擦除 5 参数化类型ParameterizedType 6 泛型的继承 7 泛型变量TypeVariable ...

  3. 泛型和Object的区别?

    泛型声明 public <T> T doSomeThing(T t){ return t; } Object声明 public Object doSomeThing(Object obj) ...

  4. C#的泛型和Java的伪泛型

    C#的泛型和java的伪泛型,talk is cheap,show me the code   C#泛型 下面结果,C#里面会输出false,如果这个还不能真正的说明C#的泛型是真的泛型,那就看下面这 ...

  5. 机房重构——泛型和“DataTable”

    前言 我们都知道在机房重构的时候,大多数都在用七层进行重构,每一层都依赖实体.所以不管怎么调用,返回的应该是实体参数,这样才符合大多数的逻辑,这样我们试想一下,如果我们要求在U层返回多个实体值,怎么办 ...

  6. Java unserialize serialized Object(AnnotationInvocationHandler、ysoserial) In readObject() LeadTo InvokerTransformer(Evil MethodName/Args)

    Java unserialize serialized Object(AnnotationInvocationHandler.ysoserial) In readObject() LeadTo Tra ...

  7. QVariant(相当于是Java里面的Object,起到一个数据类型“擦除”的作用,可以使用Q_DECLARE_METATYPE进行注册)

    =QVariant= [%这个类型相当于是Java里面的Object,它把绝大多数Qt提供的数据类型都封装起来,起到一个数据类型“擦除”的作用.比如我们的 table单元格可以是string,也可以是 ...

  8. java.lang.IllegalArgumentException: object is not an instance of declaring class

    今天在使用反射的时候,出现了java.lang.IllegalArgumentException: object is not an instance of declaring class错误-具体是 ...

  9. Java根类Object的方法说明

    Java中的Object类是所有类的父类,它提供了以下11个方法: public final native Class<?> getClass() public native int ha ...

随机推荐

  1. 洛谷P2680 运输计划(倍增LCA + 树上差分 + 二分答案)

    [题目链接] [思路]: 根据题意可以明显看出,当所有任务都完成时的时间是最终的结果,也就是说本题要求,求出最小的最大值. 那这样的话就暗示了将答案二分,进行check. [check方法]: 如果说 ...

  2. Makefile 中各种函数列举(进行 ing)

    1.wildcard : 扩展通配符    notdir : 去除路径    patsubst :替换通配符 举例:有文件  /a.c   /b.c   /home/a.c   /home/b.c  ...

  3. Python 编码错误解决方案

    Python 编码错误解决方案 Python UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 7: ordin ...

  4. android 代码里设置控件属性

    设置字体大小: setTextSize(TypedValue.COMPLEX_UNIT_PX,22); //22像素 setTextSize(TypedValue.COMPLEX_UNIT_SP,22 ...

  5. ABP 网站发布

    报错1:HTTP Error 503. The service is unavailable. 解决:IIS->应用程序池->高级设置->进程模型->标识.将内置账户更改为Ne ...

  6. django -- ORM建表

    前戏 ORM(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. ORM的优势: ORM解决的主要问题是对象和关系的映射 ...

  7. Linux下进程间通信方式——pipe(管道)

    每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把 ...

  8. 关于三层架构和MVC模式的思考

    MVC模式 核心: 1.解耦Model和View,即使得Model可以被不同的展示,比如一批统计数据可以分别用柱状图.饼图表示 2.Controller用来保证Model和View的同步 Model ...

  9. CSS基础以及兼容IE方法

    1 介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的? 标准盒子模型:宽度=内容的宽度(content)+ border + padding + margin低版本IE盒子模型:宽度 ...

  10. 第02组 Alpha冲刺(1/6)

    队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 如何进行团队代码的版本管理 如何使用微信云开发 如何使用管理微信开发团队 接下来的计划 沟通前后端成员,监督.提醒他们尽快 ...