当前位置: 首页 > news >正文

网站建设加网络营销北京公司注册中介正规

网站建设加网络营销,北京公司注册中介正规,餐饮平台app有哪些,精品资料网文件下载既然说类型变量会在编译的时候擦除掉,那为什么我们往 ArrayList 创建的对象中添加整数会报错呢?不是说泛型变量String会在编译的时候变为Object类型吗?为什么不能存别的类型呢?既然类型擦除了,如何保证我们只能使用泛型…

既然说类型变量会在编译的时候擦除掉,那为什么我们往 ArrayList 创建的对象中添加整数会报错呢?不是说泛型变量String会在编译的时候变为Object类型吗?为什么不能存别的类型呢?既然类型擦除了,如何保证我们只能使用泛型变量限定的类型呢?

Java编译器是通过先检查代码中泛型的类型,然后在进行类型擦除,再进行编译。 

例如:

public static  void main(String[] args) {  ArrayList<String> list = new ArrayList<String>();  list.add("123");  list.add(123);//编译错误  
}

在上面的程序中,使用add方法添加一个整型,在IDE中,直接会报错,说明这就是在编译之前的检查,因为如果是在编译之后检查,类型擦除后,原始类型为Object,是应该允许任意引用类型添加的。可实际上却不是这样的,这恰恰说明了关于泛型变量的使用,是会在编译之前检查的。

那么,这个类型检查是针对谁的呢?我们先看看参数化类型和原始类型的兼容。

以 ArrayList举例子,以前的写法:

ArrayList list = new ArrayList();  

现在的写法:

ArrayList<String> list = new ArrayList<String>();

如果是与以前的代码兼容,各种引用传值之间,必然会出现如下的情况:

ArrayList<String> list1 = new ArrayList(); //第一种 情况
ArrayList list2 = new ArrayList<String>(); //第二种 情况

这样是没有错误的,不过会有个编译时警告。

不过在第一种情况,可以实现与完全使用泛型参数一样的效果,第二种则没有效果。

因为类型检查就是编译时完成的,new ArrayList()只是在内存中开辟了一个存储空间,可以存储任何类型对象,而真正涉及类型检查的是它的引用,因为我们是使用它引用list1来调用它的方法,比如说调用add方法,所以list1引用能完成泛型类型的检查。而引用list2没有使用泛型,所以不行。

举例子:

public class Test {  public static void main(String[] args) {  ArrayList<String> list1 = new ArrayList();  list1.add("1"); //编译通过  list1.add(1); //编译错误  String str1 = list1.get(0); //返回类型就是String  ArrayList list2 = new ArrayList<String>();  list2.add("1"); //编译通过  list2.add(1); //编译通过  Object object = list2.get(0); //返回类型就是Object  new ArrayList<String>().add("11"); //编译通过  new ArrayList<String>().add(22); //编译错误  String str2 = new ArrayList<String>().get(0); //返回类型就是String  }  
} 

通过上面的例子,我们可以明白,类型检查就是针对引用的,谁是一个引用,用这个引用调用泛型方法,就会对这个引用调用的方法进行类型检测,而无关它真正引用的对象

泛型中参数话类型为什么不考虑继承关系

在Java中,像下面形式的引用传递是不允许的:

ArrayList<String> list1 = new ArrayList<Object>(); //编译错误  
ArrayList<Object> list2 = new ArrayList<String>(); //编译错误

我们先看第一种情况,将第一种情况拓展成下面的形式:

ArrayList<Object> list1 = new ArrayList<Object>();  
list1.add(new Object());  
list1.add(new Object());  
ArrayList<String> list2 = list1; //编译错误

 实际上,在第4行代码的时候,就会有编译错误。那么,我们先假设它编译没错。那么当我们使用list2引用用get()方法取值的时候,返回的都是String类型的对象(上面提到了,类型检测是根据引用来决定的),可是它里面实际上已经被我们存放了Object类型的对象,这样就会有ClassCastException了。所以为了避免这种极易出现的错误,Java不允许进行这样的引用传递。(这也是泛型出现的原因,就是为了解决类型转换的问题,我们不能违背它的初衷)。

再看第二种情况,将第二种情况拓展成下面的形式:

ArrayList<String> list1 = new ArrayList<String>();  
list1.add(new String());  
list1.add(new String());ArrayList<Object> list2 = list1; //编译错误

没错,这样的情况比第一种情况好的多,最起码,在我们用list2取值的时候不会出现ClassCastException,因为是从String转换为Object。可是,这样做有什么意义呢,泛型出现的原因,就是为了解决类型转换的问题。

我们使用了泛型,到头来,还是要自己强转,违背了泛型设计的初衷。所以java不允许这么干。再说,你如果又用list2往里面add()新的对象,那么到时候取得时候,我怎么知道我取出来的到底是String类型的,还是Object类型的呢?

所以,要格外注意,泛型中的引用传递的问题。

http://www.yayakq.cn/news/653773/

相关文章:

  • 什么网站做视频给钱php网页制作代码
  • 加强部门网站建设工作总结官网的网站设计公司
  • 如何在国外网站做推广做网站需要注意什么
  • 网站备案企业用个人来备案可以用吗珠海软件公司排名
  • 网站百度收录怎么做公司地址怎么注册定位
  • 做论文常用网站有哪些双语cms网站
  • 寻找网站建设员佛山网站制作平台
  • 湘西网站建设公司建设网页制作
  • 遵义网站建设哪家强企业网站设计的功能
  • 南通快速建设网站服务电子商务网站推广
  • 建设厅官方网站网站做不做备案有什么区别
  • 静态网站没有后台ajax网站
  • 搭建网站用什么框架专门做网站的公司
  • 网站托管维护代运营asp.net实用网站开发doc
  • 网站外链什么时候做北京比较好的网站开发公司
  • 免费英文 网站模板高性能网站建设进阶
  • 河南网站设计在线设计培训
  • 视频网站的制作教程网站架构设计师月薪多少
  • whois域名查询网站电商网站建设常见问题
  • 重庆好的网站建设驻马店网站建设电话
  • 黑龙江省建设银行官网站首页wordpress下载站插件
  • 建网站需成本多少钱下载类网站如何做
  • 网站内容采编怎么做网络营销相关政策有哪些
  • 芍药居网站建设公司推广链接生成
  • 电子商务网站建设干货广告型网站
  • 网站欢迎屏怎么做惠州城乡和住房建设局网站
  • 织里网站建设化州市住房和城乡建设局网站
  • 上海网站seo排名优化大良营销网站建设好么
  • 美观网站建设哪家好小说推广渠道
  • 网站商城与网站区别吗asp网站静态化