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

哪些行业需要做网站网站前后台代码

哪些行业需要做网站,网站前后台代码,营业推广的形式包括,物流公司会计好做吗深入探索Java特性中泛型技术体系的原理和实战开发指南 前提介绍泛型的介绍泛型带来的好处泛型引发的问题错觉#xff1a;泛型也可以实现多态 泛型的特点类型擦除概念定义案例分析隐患问题开发要点类型擦除的过程案例代码 实例分析类型转换问题 通配符与上下界通配符ListOb… 深入探索Java特性中泛型技术体系的原理和实战开发指南 前提介绍泛型的介绍泛型带来的好处泛型引发的问题错觉泛型也可以实现多态 泛型的特点类型擦除概念定义案例分析隐患问题开发要点类型擦除的过程案例代码 实例分析类型转换问题 通配符与上下界通配符ListObject的处理类型不确定问题抽象Object类型泛型上界 类型系统多态的类型转换泛型无法实现多态两种类型的继承体系泛型类型转换继承规则 开发自己的泛型类 总结 前提介绍 开发人员在使用泛型时常常会根据自己的直觉犯一些错误本文旨在对 Java 泛型进行概括性说明并提供一些帮助开发人员避免这些常见错误的建议。 泛型的介绍 Java泛型generics是JDK 5中引入的一项新特性允许在定义类和接口时使用类型参数type parameter。声明的类型参数在使用时用具体的类型来替换。泛型最主要的应用是在JDK 5中的新集合类框架中。对于泛型概念的引入开发社区的观点褒贬不一。 泛型带来的好处 从好的方面来说泛型的引入可以解决之前集合类框架在使用过程中通常会出现的运行时类型错误问题因为编译器可以在编译时发现很多明显的错误。然而为了保证与旧有版本的兼容性Java泛型的实现存在一些不够优雅的地方。这也是任何有历史的编程语言所需要承担的历史包袱。 未来的版本更新将会解决早期设计缺陷所带来的问题。 泛型引发的问题 错觉泛型也可以实现多态 例如如果一个方法接收 List 作为形式参数尝试将一个 List 的对象作为实际参数传递进去就会发现无法通过编译。 尽管从直觉上来看Object 是 String 的父类这种类型转换应该是合理的但实际上这会产生隐含的类型转换问题因此编译器直接禁止这样的行为。 泛型的特点 在Java中泛型基本上都是在编译器层次实现的。 类型擦除 概念定义 正确理解泛型概念的首要前提是理解类型擦除type erasure在生成的Java字节代码中不包含泛型中的类型信息。在使用泛型时加上的类型参数会在编译时被编译器去掉这个过程称为类型擦除。 案例分析 例如代码中定义的 List 和 List 等类型在编译后都会变成 List。JVM看到的只是 List而泛型附加的类型信息对JVM来说是不可见的。 隐患问题 Java编译器会在编译时尽可能地发现可能出错的地方但仍无法避免在运行时出现类型转换异常的情况。类型擦除也是Java的泛型实现方式与C模板机制实现方式之间的重要区别。 开发要点 很多泛型的特性要点都与这个类型擦除的存在有关包括 泛型类并没有独立的 Class 类对象。例如List.class 或 List.class 并不存在只有 List.class 存在。 静态变量是被泛型类的所有实例所共享的。对于声明为 MyClass 的类访问其中的静态变量的方法仍然是 MyClass.myStaticVar。无论是通过 new MyClass 还是 new MyClass 创建的对象它们都共享一个静态变量。 泛型的类型参数不能用于 Java 异常处理的 catch 语句中。因为异常处理是由 JVM 在运行时刻进行的而类型信息被擦除JVM 无法区分两个异常类型 MyException 和 MyException。对于 JVM 来说它们都是 MyException 类型的因此无法执行与异常对应的 catch 语句。 类型擦除的过程 首先会找到用于替换类型参数的具体类通常是 Object 类。如果指定了类型参数的上界则使用该上界。然后将代码中的类型参数替换为具体类并删除所有类型声明即删除中的内容。 例如T get() 方法声明将变为 Object get()而 List 将变为 List。 在此过程中可能需要生成一些桥接方法bridge method因为擦除类型后的类可能缺少某些必要的方法。 案例代码 例如考虑以下代码 class MyString implements ComparableString {public int compareTo(String str) { return 0; } }当类型信息被擦除之后上述类的声明变成了 class MyString implements Comparable。但是这样的话类 MyString 就会有编译错误因为没有实现接口Comparable 声明的 int compareTo(Object)方法。这个时候就由编译器来动态生成这个方法。 实例分析 了解了类型擦除机制后就会明白编译器承担了全部的类型检查工作。编译器禁止某些泛型使用方式正是为了确保类型的安全性。下面以 List 和 List 为例具体分析 public void inspect(ListObject list) { for (Object obj : list) { System.out.println(obj); } list.add(1); //这个操作在当前方法的上下文是合法的 } public void test() { ListString strs new ArrayListString(); inspect(strs); //编译错误 }这段代码中inspect方法接收List作为参数。如果在test方法中试图传入List则会出现编译错误。 类型转换问题 假设这样的做法是允许的那么在inspect方法中就可以通过list.add(1)来向集合中添加一个数字。这样在test方法看来其声明为List的集合中却被添加了一个Integer类型的对象。这显然是违反类型安全原则的某个时候肯定会抛出ClassCastException异常。 因此编译器禁止这样的行为。编译器会尽可能地检查可能存在的类型安全问题。对于确定是违反相关原则的地方会给出编译错误。当编译器无法判断类型的使用是否正确时会给出警告信息。 通配符与上下界 在使用泛型类的时候既可以指定一个具体的类型如 List就声明了具体的类型是String也可以用通配符?来表示未知类型如 List?就声明了 List 中包含的元素类型是未知的。 通配符 通配符所代表的其实是一组类型但具体的类型是未知的。List?所声明的就是所有类型都是可以的。但是List?并不等同于 List。 List的处理 List实际上确定了 List 中包含的是 Object 及其子类在使用的时候都可以通过 Object 来进行引用。 类型不确定问题 类型唯一性List?则其中所包含的元素类型是不确定。其中可能包含的是 String也可能是 Integer。如果它包含了 String的话往里面添加 Integer 类型的元素就是错误的。 实例声明未知不能通过 new ArrayList?()的方法来创建一个新的 ArrayList 对象。因为编译器无法知道具体的类型是什么。 抽象Object类型 但是对于 List?中的元素确总是可以用 Object 来引用的因为虽然类型未知但肯定是Object 及其子类。考虑下面的代码 public void wildcard(List? list) {list.add(1);//编译错误 }如上所示试图对一个带通配符的泛型类进行操作的时候总是会出现编译错误。其原因在于通配符所表示的类型是未知的。 泛型上界 因为对于 List?中的元素只能用Object 来引用在有些情况下不是很方便。在这些情况下可以使用上下界来限制未知类型的范围。如 List? extends Number 说明List中可能包含的元素类型是Number及其子类而List? super Number则说明List中包含的是 Number 及其父类。 当引入了上界之后在使用类型的时候就可以使用上界类中定义的方法比如访问 List? extends Number的时候就可以使用 Number类的 intValue 等方法。 类型系统 在Java中大家比较熟悉的是通过继承机制而产生的类型体系结构那就是多态特性。 多态的类型转换 比如String继承自Object根据 Liskov替换原则 子类是可以替换父类的。当需要Object类的引用的时候如果传入一个String对象是没有任何问题的。但是反过来的话即用父类的引用替换子类引用的时候就需要进行强制类型转换。 泛型无法实现多态 编译器并不能保证运行时刻这种转换一定是合法的。这种自动的子类替换父类的类型转换机制对于数组也是适用的。String[]可以替换Object[]。但是泛型的引入对于这个类型系统产生了一定的影响。正如前面提到的List是 不能替换掉List的。 两种类型的继承体系 引入泛型之后的类型系统增加了两个维度一个是类型参数自身的继承体系结构另外一个是泛型类或接口自身的继承体系结构。 List和List这样的情况类型参数String是继承自 Object 的。List接口继承自Collection 接口。 泛型类型转换继承规则 相同类型参数的泛型类的关系取决于泛型类自身的继承体系结构即List 是 Collection 的子类型 List 可以替换Collection。这种情况也适用于带有上下界的类型声明。 当泛型类的类型声明中使用了通配符的时候其子类型可以在两个维度上分别展开。 对 Collection? extends Number来说其子类型可以在Collection这个维度上展开即List? extends Number和 Set? extends Number等在Number 这个层次上展开即 Collection和 Collection等。如此循环下去ArrayList和 HashSet等也都算是 Collection? extends Number的子类型。 如果泛型类中包含多个类型参数则对于每个类型参数分别应用上面的规则。 理解了上面的规则之后就可以很容易的修正实例分析中给出的代码了。只需要把List改成 List?即可。List是 List?的子类型因此传递参数时不会发生错误。 开发自己的泛型类 泛型类与一般的 Java 类基本相同只是在类和接口定义上多出来了用声明的类型参数。一个类可以有多个类型参数如 MyClassX, Y, Z。 每个类型参数在声明的时候可以指定上界。所声明的类型参数在 Java 类中可以像一般的类型一样作为方法的参数和返回值或是作为域和局部变量的类型。但是由于类型擦除机制类型参 数并不能用来创建对象或是作为静态变量的类型。考虑下面的泛型类中的正确和错误的用法。 class ClassTestX extends Number, Y, Z { private X x; private static Y y; //编译错误不能用在静态变量中 public X getFirst() {//正确用法 return x; } public void wrong() { Z z new Z(); //编译错误不能创建对象 } }总结 Java泛型为我们提供了一种更加类型安全和灵活的编程方式但也需要我们在使用时注意其一些局限性和设计缺陷。 建议在代码中避免泛型类和原始类型的混用例如List和List不应该共同使用因为这样会产生一些编译器警告和潜在的运行时异常。如果需要利用JDK 5之前开发的遗留代码也应尽可能隔离相关的代码。 在使用带通配符的泛型类时需要明确通配符所代表的一组类型的概念。由于具体的类型是未知的很多操作是不允许的。 最好不要将泛型类与数组一起使用。虽然可以创建new List?[10]这样的数组但无法创建new List[10]这样的数组。这限制了数组的使用能力而且会带来很多费解的问题。因此在需要类似数组的功能时建议使用集合类。 请不要忽视编译器给出的警告信息这些警告信息可能会指出代码中存在的潜在问题及时修复可以避免后续出现更严重的问题。
http://www.pierceye.com/news/504983/

相关文章:

  • 无锡网站推微信公众号文章里好看的图片在哪个网站做
  • 做网站建设费用预算龙岩市建筑设计院
  • 网站做适配多少钱浙江建设厅特种考试查询
  • 简单的网站更新 关键词优化 关键词互联如何做网
  • 重庆网站seo搜索引擎优化网站qq登录 开发
  • 备案号放网站下面居中物流网站制作目的
  • 房产网站排名做情侣网站
  • 营销型网站建设推荐国内团购网站做的最好的是
  • 前端网站建设苏州高新区建设局网站管网
  • 中小企业网站建设中服务器的解决方案是网站建设推广总结
  • 东莞网站建设新闻资讯做赌场网站犯法么
  • wordpress怎么添加单页模版seo价格是多少
  • 网站域名有了_网站如何建设优书网首页
  • 宠物网站建设策划报告Wordpress is文章展示
  • 电子建设网站的目的阿里巴巴网站是用什么技术做的
  • 图形设计网站wordpress微信群多个二维码
  • 网站建设维护是干什么网站用户需求报告
  • 咸宁网站建设公司水网站模板
  • 移动网站开发教材seo网站排名优化价格
  • 重生做网站小说畅想网络网站建设推广
  • 找个做网站的 优帮云wordpress 判断自定义栏目
  • wordpress文章目录分页wordpress加速优化服务
  • 二级目录网站怎么做小程序开发成都公司
  • 网站标题名字和备案名字网站开发 质量管理
  • 网站与系统开发吉安网站建设收费
  • 湖北襄阳网站建设wordpress电商ar
  • 微做网站环保行业网站建设
  • 昭通做网站公司北京手机网站制作多少钱
  • 昆明企业建网站多少钱如何弄微信小程序
  • wordpress清理网站缓存做的比较简约的网站