引言

我们使用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. 如何开启telnet服务LINUX&Windows

    一.LINUX centos 1.Linux安装telnet包 # yum install telnet* # rpm -qa |grep telnet telnet-server-0.17-47.e ...

  2. linux上查看swf文件.靠谱

    在linux上查看swf文件,本来想用gnash 来看,可是有的电脑上看的时候只有声音,没有图像 所以用网页来查看,推荐谷歌 我们在和flash文件的同目录下新建一个文件名为:index.html 注 ...

  3. 201871010108-高文利《面向对象程序设计(java)》第二周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>http ...

  4. MySQL 官方测试库

    MySQL 官方测试库 github 地址 https://github.com/datacharmer/test_db MySQL 文档地址 https://dev.mysql.com/doc/em ...

  5. jdbc笔记2

    private static String driver; private static String url; private static String username; private sta ...

  6. Ant Design的Form

    Ant Design的Form 使用onFieldsChange时不要与 mapPropsToFields一起使用,将导致表单校验等失效

  7. 37 树莓派识别opencv-dnn

    https://heartbeat.fritz.ai/real-time-object-detection-on-raspberry-pi-using-opencv-dnn-98827255fa60 ...

  8. nginx 实际部署配置文件示例

    user nobody; worker_processes ; error_log logs/error.log; pid logs/nginx.pid; events { worker_connec ...

  9. git修改远程仓库名称[gitolite]

    参考 https://stackoverflow.com/questions/4708465/how-do-i-rename-a-git-repository-created-with-gitolit ...

  10. pom.xml文件引入tools.jar

    最近做hbase开发时,引入相关jar包后,出现了以下错误 Missing artifact jdk.tools:jdk.tools:jar:1.8 绝对地址引用 <dependency> ...