Class<Object>与Class<?>有何区别呢
1、? 和 Object 差不多,不过还是有差别。
在这种情况下: class<? extends SomeClass> , Object就不能用了
Object是一个具体的类名,而?是一个占位符号,表示任何类型,只要是SomeClass类或者子类就可以。
List<Object>可以放任何类对象
List<? extends InputStream>就只能放InputStream的实现类了。
运行时刻,没错,Java的泛型是不存在,所以说,效率没有任何影响。
2、泛型中使用通配符?代表类型参数可以是任何对象类型,也可以使用extends表示参数类型可以是某类或其子类,参数类型主要是用于解决早期版中集合取数据时的拆箱操作
3、Java中的泛型是个假泛型,仅仅只是在编译器那边做了语法检查而已,和C#里的泛型不一样的。基本上,不管你在List<>里面写什么类型,编译通过了以后运行时全部都是Object。
4、如果方法参数声明为:
public Page(int start, int totalSize, int pageSize, List<Object> data) {
则构造函数第四个参数传入List<String>,会编译报错。
说明:Java泛型确实是通过类型擦除实现的,编译器的语法检查是次要的,重要的是泛型系统可以为我们做更多的类型检查,这在很多时候是很有帮助的,借助编译器在编译期的类型检查可以减少运行时出现类型错误的几率。
比如foo方法把一个Object对象加入List中,我们期望这个List可以存放任何类型的对象。
如果用原生类型List,就像这个方法,void foo(List list, Object o)
我们可以这么调用foo:
List<Integer> integers = new ArrayList<Integer>();
foo(integers, "bar")
这段代码是可以编译通过的,编译器会有一个警告,但事实上我们并不希望允许这样调用foo,我们的本意是foo的第一个参数是一个可以存放任何类型对象的List,但integers显然不是的。
但如果我们的foo方法是这样子的,void foo(List<Object> list, Object o)
现在如果我们尝试这样子调用foo,就会产生编译错误
List<Integer> integers = new ArrayList<Integer>();
foo(integers, "bar")
编译器的类型检查让我们提前发现了问题,而不是等到程序运行抛出异常时才想到,“嘿,你怎么能这么调用foo?”
Class<Object>与Class<?>有何区别呢的更多相关文章
- JAVA常识积累
java Class<? extends Object> getClass() 这么写是什么意思 Class<? extends Object> 泛型Object以及Objec ...
- asp.net将object或string转为int
在C#强制转换中,(int),Int32.Parse() 和 Convert.toInt32() 三种方法有何区别? int 关键字表示一种整型,是32位的,它的 .NET Framework 类型为 ...
- 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)
浅谈c#的三个高级参数ref out 和Params c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...
- js精确判断数据类型为何用Object.prototype.toString.call()而不是Object.prototype.toString()
有何区别,为何一定要通过call. 我们知道call是用来改变函数作用域的,Object.prototype.toString.call在这儿也是用来改变作用域的. Object.prototype. ...
- Function和Object 应该知道的
javascript有5种基础的内建对象(Fundamental Objects),Object.Function.Error.Symbol.Boolean,而Object/Function尤为特殊, ...
- 类属性和__init__的实例属性有何区别?进来了解一下吧
真的是随笔写的一篇,以防日后记忆模糊,特此记录.大佬勿喷 疑问:类属性和实例属性有何区别? 正题,代码如下 age为People类的属性(称为类属性) name是在__init__方法下,在创建实例对 ...
- CoreCLR源码探索(一) Object是什么
.Net程序员们每天都在和Object在打交道 如果你问一个.Net程序员什么是Object,他可能会信誓旦旦的告诉你"Object还不简单吗,就是所有类型的基类" 这个答案是对的 ...
- JavaScript Object对象
目录 1. 介绍:阐述 Object 对象. 2. 构造函数:介绍 Object 对象的构造函数. 3. 实例属性:介绍 Object 对象的实例属性:prototype.constructor等等. ...
- javascript之Object.defineProperty的奥妙
直切主题 今天遇到一个这样的功能: 写一个函数,该函数传递两个参数,第一个参数为返回对象的总数据量,第二个参数为初始化对象的数据.如: var o = obj (4, {name: 'xu', age ...
随机推荐
- 高级I/O之readn和writen函数
管道.FIFO以及某些设备,特别是终端.网络和STREAMS设备有下列两种性质: (1)一次read操作所返回的数据可能少于所要求的数据,即使还没有达到文件尾端也可能是这样.这不是一个错误,应当继续读 ...
- HBase Error: connection object not serializable
HBase Error: connection object not serializable 想在spark driver程序中连接HBase数据库,并将数据插入到HBase,但是在spark集群提 ...
- 中兴电信光纤猫F612管理员密码获取方法
1.telnet 192.168.1.1 账号:root 密码:Zte521 2.输入命令: sendcmd 1 DB p DevAuthInfo 得到管理员账号密码如下: <DM name=& ...
- cocos2d-x中使用Http
一.如何使用 //发送接口 void CmdHelper::postRequest(const char* cmdTag, const char* url, const char* postData, ...
- Oracle_11g中解决被锁定的scott用户的方法(转载)
转自:http://www.2cto.com/database/201402/277206.html Oracle 11g中修改被锁定的用户:scott 在安装完Oracle11g和创建完oracle ...
- [改善Java代码]异常只为异常服务
异常原本是正常逻辑的补充,但是有时候会被当做主逻辑使用.看如下代码: public class Client { enum Color { Red, Blue; } public static voi ...
- 核心概念 —— 门面(Facades)
1.简介 门面为应用的服务容器中的绑定类提供了一个"静态"接口.Laravel 内置了很多门面,你可能在不知道的情况下正在使用它们.Laravel 的门面作为服务容器中的底层类的& ...
- Ehcache(2.9.x) - API Developer Guide, Class Loading
About Class Loading Class loading, within the plethora of environments that Ehcache can be running, ...
- Nginx - Additional Modules, Content and Encoding
The following set of modules provides functionalities having an effect on the contents served to the ...
- NAT地址转换原理全攻略
NAT转换方式及原理 在NAT的应用中,可以仅需要转换内部地址(就是“内部本地址”转换成“内部全局地址”),这是最典型的应用,如内部网络用户通过NAT转换共享上网:也可以是仅需要转换外部地址(就是“外 ...