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

子商务网站建设的一般流程域名交易asp.net 网站

子商务网站建设的一般流程,域名交易asp.net 网站,企点下载,电子商务网站建设与管理课程的感想目录 什么是泛型 泛型与编译器 不要轻易使用原生态类型 可以通过通配符类型来替代原生态类型 几个适合原生态类型的场景 消除非受检的警告 什么是非受检警告 如果无法消除警告 本书27-33条主要介绍泛型。首先介绍什么是泛型#xff0c;它的应用场景是什么。然后重点介…目录 什么是泛型 泛型与编译器 不要轻易使用原生态类型 可以通过通配符类型来替代原生态类型 几个适合原生态类型的场景 消除非受检的警告 什么是非受检警告 如果无法消除警告 本书27-33条主要介绍泛型。首先介绍什么是泛型它的应用场景是什么。然后重点介绍27和28条对于泛型编程的两点意见。一是不要轻易使用原生态类型二是尽量消除非受检警告。 什么是泛型 顾名思义“泛型”指的是“多种类型”声明中具有一种或多种类型参数的类或者接口成为泛型类或者泛型接口这两者统称为泛型。常见的泛型接口包括ListT和SetT。 泛型与编译器 首先要明确一个概念泛型的受用范围仅限于编译阶段编译完成后通过类型擦除进入执行的程序是不带有泛型信息的,下面举一个例子 //定义一个简单的泛型 public class MyclassT {private T t;public void setT(T t) {this.t t;}public T getT() {return t;} } 通过javac将Myclass类编译后由于类型擦除的原因当你将其反编译后相关的泛型信息会自动被替换成对应的实际类型以下是通过javap反编译后的内容 public class MyclassT {public Myclass();Code:0: aload_01: invokespecial #1 // Method java/lang/Object.init:()V4: returnpublic void setT(T);Code:0: aload_01: aload_12: putfield #7 // Field t:Ljava/lang/Object;5: returnpublic T getT();Code:0: aload_01: getfield #7 // Field t:Ljava/lang/Object;4: areturn } 这里可以看到泛型类中的两个泛型方法public void setT(T)和public T get()的输入和输出域原来的泛型T表示都被改换成了Ljava/lang/Object;这里有的朋友会问为什么从还原的源码中仍然能够看到泛型那是因为尽管类型擦除移除了泛型的具体类型信息Java 编译器仍然会在字节码中添加一些额外的信息来支持运行时的类型安全性和泛型的正确使用。而反编译器会利用这些标注自动还原出原有的泛型信息。 那么在编译阶段编译器会对于泛型做哪些操作来确保类型的安全性和正确性呢 首先是类型检查一是类型的兼容性检查编译器会检查泛型类型的使用是否符合类型兼容性规则。例如确保泛型参数的使用与上下文中的类型相匹配。二是类型参数限制如果泛型参数有类型界限如 T extends Number编译器会确保传递给泛型参数的实际类型符合这些界限。 其次是类型推断编译器能够自动推断出泛型参数的具体类型这使得开发者在某些情况下不必显式指定泛型参数的类型。比如对于泛型的初始化 ListString stringlist new ArrayList(); 这里ArrayList的初始化就不需要指定对应类型编译器会自动推断。 类型擦除编译器在编译阶段会去除泛型类型信息将泛型类型转换为其对应的原始类型例如ListT 变为 List。 插入类型转换为了确保类型安全编译器会在适当的位置插入必要的类型转换语句。比如要在一个ListObject中插入一个Integer编译器就会讲Integer类型强制转换成Object。 了解了编译器对于泛型进行的各种操作就可以很好的理解书中的27、28两条。 不要轻易使用原生态类型 原生态类型即隐去了泛型参数信息的类或者接口比如List是ListString的原生态类型。这里需要强调的是原生态类型是对应泛型的超类。 很好理解使用原生态类型以后类或者接口失去了泛型的属性自然而然就会绕过编译器的各种类型检测功能也就失去了泛型在安全性和描述性上所有的优势。也就是说如果程序错误插入了一个不同类型的元素这个错误会一直保留到运行中当调用这个元素的方法出现问题的时候才会暴露问题另一方面编译器无法进行自动的类型转换因此如果有相关的需求需要靠手动转换。 下面给一个使用了原生态类型的案例这个原本计划只有Integer的List中混入了String类型虽然编译器会给出Application.java uses unchecked or unsafe operations.的告警但是并未显示任何实质性的警告只有当程序运行中调用到“30”这个元素时才会真正显示错误另一方面由于编译器未进行插入类型转换因此对于每一个元素都要进行Integer的强制类型转换否则系统默认会当作Object来处理。 public class Application {public static void main(String[] args) {List list new ArrayList();list.add(21);list.add(23);list.add(30);for(Iterator i list.iterator(); i.hasNext();){System.out.println((Integer)i.next()1);}} } //编译警告 (base) chapter5$ javac Application.java Note: Application.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.//运行异常 (base) chapter5$ java Application 22 24 Exception in thread main java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader bootstrap) 可以通过通配符类型来替代原生态类型 我们已经知道了原生态类型是有缺陷的那当需要表示无限制类型的泛型时要如果实现呢答案是无限制的通配符类型。 通配符类型是泛型功能的扩展泛型将类和接口的应用类型设置为参数而通配符就是允许把这个参数设置为一个集合。 public class WildcardDemo {public static void main(String[] args) {ListInteger intList new ArrayList();ListNumber numList new ArrayList();// 使用上界通配符printNumbers(intList);printNumbers(numList);// 使用下界通配符addElement(intList, 100); // intList 是 Number 的子类型addElement(numList, 100); // numList 本身就是 Number 类型}public static void printNumbers(List? extends Number list) {for (Number n : list) {System.out.println(n);}}public static T extends ComparableT void addElement(List? super T list, T element) {list.add(element);} } 这里printNumbers方法的输入参数是泛型接口List的上界通配符类型代表该方法可以输入的泛型的类型参数可以是Number的子类。 这里要注意对于无限制通配符类型?,不能将任何元素除null以外放入因为编译器无法确定相关元素是否符合类型要求对于迭代器来说泛型的类型要求是一个未知类型。 几个适合原生态类型的场景 在类文字中使用原生态类型类文字是表示类的 Class 对象的一种特殊文字。List.class是合法的而List?.class不合法。 通过instanceof操作符判断类型用参数化类型使用instanceof操作符是非法的但是无限制性通配符和原生态类型都是合法的。 消除非受检的警告 什么是非受检警告 首先警告是编译器在编译过程中发现的“异常”编译过程中会有警告和错误两种“异常”其中警告是对于运行过程中可能存在问题的提醒但不影响编译的正常进行而一旦存在错误将会提前终止编译。下面总结一下编译器的“异常”和程序运行过程中的“异常”。 非受检警告如果被无视就有可能在程序运行中出现各种异常或者错误情况所以这也是为什么非受检异常无必要消除的原因另外的弃用警告和未使用变量警告的影响会小一些但最好还是也注意消除一下。 如果无法消除警告 如果无法消除同时证明引起警告的代码是类型安全的才可以使用一个SupressWarnings“unchecked”注解来禁止这条警告。 SupressWarnings(“unchecked”)注解可以用在任何粒度的级别中从单独的局部变量声明到整个类都可以但是请尽量在尽可能小的范围内使用否则可能会掩盖重要的警告永远不要直接在类上使用。 注意每次使用该注解时都要添加一条注释说明这么做为什么是安全的。
http://www.dnsts.com.cn/news/236433.html

相关文章:

  • 乐山建网站百度权重高的发帖网站
  • 网站建设公司费用win10 wordpress
  • 网站流量监测欧美一级a做爰片免费网站
  • 武义公司网站建设朝阳网络科技有限公司
  • 建设厅网站装修合同模板宣传片拍摄脚本模板
  • 如何通过阿里云自己做网站wordpress 整合ckplayer
  • 深圳网站建设哪家比较专业wordpress标签
  • 网站好玩代码和特效免费开个人网店
  • 地方网站优势中企动力网站模板
  • 网站建设柒金手指下拉二一吉安网络科技有限公司
  • 网站实名认证功能怎么做wordpress会建站怎么找工作
  • 网站开发的开发意义太原富库网站建设
  • 淘宝首页网站怎么做做外贸需要网站吗
  • 做电子书网站做微信公众号海报的网站
  • 诸暨市建设局网站最大招聘网站
  • 学校网站建设自检自查报告网站备案多少岁可以做
  • 制作公司网站岱山县建设网站
  • 门户网站建设 存在的问题网站建设分为几个时期
  • 网站建设方案调查分析报告字体版权登记网站
  • 网站开发摘要wordpress登录才能查看
  • 网站没续费会怎样广州建网站公司
  • 沧浪企业建设网站公司智慧建设网站
  • 珠海网站建设贵公司jsp 数据库做网站
  • 邯郸网站制那个网站可以做双色球号码对比的
  • 网站开发实战演练wordpress初音主题
  • 清晰化网站python语言程序设计基础
  • 网站建设 微信开发网站订票策划方案
  • 东莞城乡建设网站网站开发毕业指导手册
  • 合肥建站费用商城源码哪家公司好
  • 公司网站制作一般多少钱杭州企业管理咨询有限公司