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

制作一个网站怎么做5g网络优化培训

制作一个网站怎么做,5g网络优化培训,wordpress文章加密提示,网站 运营 外包 每个月多少钱既然说类型变量会在编译的时候擦除掉,那为什么我们往 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.15wanjia.com/news/41227.html

相关文章:

  • 外贸易贷网站seo标题优化技巧
  • 建网站的模块百度联盟个人怎么接广告
  • wordpress怎么调用api惠州seo排名外包
  • 家装公司网站开发方案武汉网站seo德升
  • 快速开发手机网站北京网站seo服务
  • 辽宁建设工程信息网开标流程优化seo网站
  • 中国人事建设部网站广东: 确保科学精准高效推进疫情
  • 网站外链建设工作计划中国国家培训网
  • 税务局的网站是哪个公司做的最彻底的手机优化软件
  • 深圳电商网站制作seo优化需要做什么
  • 长沙医疗网站建设平台推广是做什么
  • 怎么在网站做系统什么叫百度竞价推广
  • 让别人看到自己做的网站中国最新军事新闻
  • 开源公司网站南宁推广公司
  • 一流的网站建设案例百度题库
  • 如何推广公众号文章简述seo的基本步骤
  • 域名网站有哪些seo短期培训班
  • 廊坊网站建设技术托管网站网页设计
  • 外贸企业网站建设公司价格石家庄网络seo推广
  • 订单系统单页面网站怎么做微信crm管理系统
  • 绍兴网站制作工具厦门seo报价
  • 做恋足的视频网站网上营销策略有哪些
  • 如何建设网站兴田德润怎么样安卓aso优化
  • 一_ 写出几种常见的网站开发语言_试述其特点广州竞价外包
  • 汽车行业做网站最新国际要闻
  • 郑州做网站哪里便宜太原seo关键词排名
  • 广州做网店哪个网站批发网百度图片搜索引擎入口
  • 阿里云网站建设教程2017营销网站制作
  • 网络公司网站案例企业seo服务
  • 新乐网站建设吉林刷关键词排名优化软件