Java编程中<Object>对象类型<T>泛型<?>通配类型区别傻傻分不清楚
喜欢学习研究的同学可能发现别人的代码中,有的时候使用返回Object,有的使用<T>泛型,如果使用<T>泛型的代码里可能还会出现<?>这样的符号,凭着好几年前上学的记忆大致能理解为Object是所有类型的父类,能代表所有类型,泛型是不限制类型也可以代表所有类型,那这个时候就懵逼了,我今天就说明白他们的区别。
Object
Object在Java是大佬级别的存在,一切皆对象,都是源于Object,所以Object可以承载任何对象,例如Object就是世界,但是他到底是人还是鬼,只有运行的时候才能知道。所以一旦出现强制转换的错误在编译时是没办法检查出来的。
<T>泛型
跟他的名字一样,泛泛的类型,在声明定义的时候声明泛型,使用时指定具体的类型,这样在编译时就可以检查类型转换错误了,例如List<T>这个类,他就声明了一个泛型,在使用时我们必须指定明确的类型List<String>,这样就明确了集合里面是什么类型的东西,方便代码的检查,和转换安全。
<?>通配符
如果使用泛型,在内部你还不知道这个泛型是什么类型,但需要限制一下它,那就可以使用<?>来表示他,例如:限制它是Number的子类就用List<? extends Number>,它是Number的父类就用List<? extends Number>。
案例加深印象
我们先声明两个方法,一个使用Object,一个使用<T>泛型,我们感受一下区别:
public Object doSomething(Object obj) {....}
public <T> T doSomething(T t) {....}
首先这两个方法都可以接收任何类型的对象,也可以返回任何的对象,但是使用中就会出现区别,例如:
MyClass<Foo> my = new MyClass<Foo>();
Foo foo = new Foo();
//使用 public <T> T doSomething(T t)
Foo newFoo = my.doSomething(foo);
//使用 public Object doSomething(Object obj)
Foo newFoo = (Foo) my.doSomething(foo);
发现什么区别了?是不是使用泛型的方法我们在写代码的时候就知道他会返回什么,而使用Object的方法还需要一次强制转换,甚至有的时候只有运行起来才知道是什么类型。使用泛型不需要强制转换、编译时检查类型更安全。
商业用途请联系作者获得授权。
版权声明:本文为博主「任霏」原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接及本声明。
相关推荐
猜你还喜欢这些内容,不妨试试阅读一下评论与留言
以下内容均由网友提交发布,版权与真实性无法查证,请自行辨别。微信订阅号
扫码关注「任霏博客」微信订阅号- 大佬 引入jar包那里的 driver class 怎么选的?
- 我也遇到了这个问题,已经解决了,在此分享一下 1、宿主机也要创建kingbase的用户和用户组,并且要查看一下用户和用户组的ID(这个很重要) 2、把data目录的用户和用户组设置为kingbase 3、先不要把data路径挂载到宿主机上,这时就可以正常启动,启动后进入容器,查看一下容器内的kingbase的用户和用户组ID是多少,和第一步的ID是否一致,如果ID一致,那正常挂载目录就行;如果ID不一致,那就需要修改Dockerfile文件,在构建镜像时,修改容器内的用户和用户组ID,必须和宿主机的保持一致。然后重新构建镜像,就可以正常挂载宿主机目录了 4、其实直接修改宿主机的用户和用户组ID也是可以的,但是容器内的ID一般是1000,但是宿主机的这个ID很可能已经被占用了,无法修改,就只能修改容器内的ID
- 接口已经允许跨域请求,也就是说你可以在你的页面上调用,获取用户的公网 IP。 如果你还需要其他需求,可以提交 Issue 给我。
- V008R003C002B0320 这个对应的jdbc链接驱动你在哪里找到的?我也遇到了这个问题。
- WARNING: max_connections should be less than orequal than 10 (restricted by license) HINT: the value of max_connect is set 10 WARNING: max_connections should be less than orequal than 10 (restricted by license) HINT: the value of max_connect is set 10 kingbase: superuser_reserved_connections must be less than max_connections 我按照文档修改了以后,不知道如何重启。
- 然后把数字都改成 1 再启动。 如何重新启动?
- ksql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.KINGBASE.54321"
- 进入容器查看一下日志,是不是启动失败了,日志文件在:/opt/kingbase/logfile
- ksql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.KINGBASE.54321"?
- 先通过 docker exec -it 容器名/id /bin/bash 进入容器,然后在容器中使用 ksql 客户端进行连接数据库:/opt/kingbase/Server/bin/ksql -U system test
- 免费.ml域名10年委托合同到期被马里共和国收回域名经营权
- 从极狐Gitlab看各种中间件技术选型
- 时隔十年首次收到 Google AdSense 的付款
- ga域名被加蓬共和国从Freenom公司手中收回域名经营权
- Freenom 被 Meta(Facebook) 起诉导致暂停 .tk/.ga/.ml/.cf/.gq 等新域名注册
- 生花妙笔信手来 – 基于 Amazon SageMaker 使用 Grounded-SAM 加速电商广告素材生成 [1]
- github.renfei.net 不再完整代理 Github 页面改为代理指定文件
- 优雅的源代码管理(三):本地优雅的使用 Git Rebase 变基
- 优雅的源代码管理(二):Git 的工作原理
- 优雅的源代码管理(一):版本控制系统 VCS(Version Control System)与软件配置管理 SCM(Software Configuration Management)