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

中华住房和城乡建设厅网站知乎自媒体平台注册

中华住房和城乡建设厅网站,知乎自媒体平台注册,长沙网站制作公司在哪里,朝阳网络科技有限公司说明#xff1a;在学习泛型这一知识点中#xff0c;主要参考自《疯狂Java讲义》第7章P307-P330的泛型内容#xff0c;因为是跳着阅读#xff0c;所以前面的一些名词不是特别清楚#xff0c;这里也做出适当备注#xff0c;供自己识记与理解。 1.泛型 理解#xff1a;说到…说明在学习泛型这一知识点中主要参考自《疯狂Java讲义》第7章P307-P330的泛型内容因为是跳着阅读所以前面的一些名词不是特别清楚这里也做出适当备注供自己识记与理解。 1.泛型 理解说到泛型感觉最初是为了解决Java集合的一个缺点——当我们想要把一个对象放进集合里面的时候集合就会忘记这个对象的数据类型再次把它取出来时它的编译类型就会变成Object类型运行类型不会变。记住我们的目标是在集合里面存储不会被忘记数据类型的各种对象。例子 1 package FanXing;2 3 public class ListErr {4 public static void main(String[] args) {5 List strList new ArrayList();6 strList.add(泛型主题讨论);7 strList.add(017);//这里不小心把一个Integer对象放在了集合里面可能报类型强制转换异常ClassCastException8 for(int i0;istrList.size();i)9 {String str (String)strList.get(i); 10 } 11 } 12 }编译信息 Exception in thread main java.lang.Error: Unresolved compilation problems: List cannot be resolved to a type ArrayList cannot be resolved to a type at FanXing.ListErr.main(ListErr.java:5) 图中的红色框已经提示我们需要用什么区解决所面临的的问题了。 为了达到我们的目标我们想到了可以手动实现编译时去检查类型。 例子既然会发生异常那我们就在运行前先检查我们这里先创建一个对象List,让它只保存字符串类型这样就可以扩展ArrayList类 package FanXing;import java.util.ArrayList; import java.util.List;class StrList{private List strList new ArrayList();public boolean add(String ele)//定义StrList的add方法只添加字符串{return strList.add(ele);}public String get (int index){return (String)strList.get(index);}public int size(){return strList.size();} }public class ListErr {public static void main(String[] args) {StrList strList new StrList();strList.add(泛型主题讨论);//strList.add(017);如果没有这一句代码可以成功被编译否组会报错。System.out.println(strList);for(int i0;istrList.size();i){String str strList.get(i);}} } 上面的代码中我们定义的StrList类实现了编译时的异常检查当编译到strList.add(017);时程序试图将一个Integer对象加入到StrList集合中程序在这里会无法编译通过因为StrList只接受String的对象。 不过既然只接受String对象的时候可以编译通过说明这个方法还是有用的但是这种方法虽然有效局限性却非常明显——我们需要去定义大量的List子类。 虽然这样也可以实现我们的目标在集合里面存储不会被忘记数据类型的各种对象。不过这样非常非常麻烦这个时候我们的泛型就被设计出来了有了它我们的目标可以轻易实现。 package FanXing;import java.util.ArrayList; import java.util.List;public class ListErr {public static void main(String[] args) {ListString strList new ArrayListString();//创建一个List集合只保留字符串strList.add(泛型主题讨论);for(int i 0;istrList.size();i){String str strList.get(i);}} } 很显然这样代码简化了很多ListString说明这是一个String类型的List。 所以这里我们可以归纳出如果List尖括号里面是其他类型的话也是同理即有了一个JDK1.5以后引入的概念 Java泛型generics【Java的参数化类型】 是JDK 5中引入的一个新特性允许在定义类和接口的时候使用类型参数type parameter。声明的类型参数在使用时用具体的类型来替换。泛型最主要的应用是在JDK 5中的新集合类框架中。 泛型最大的好处是可以提高代码的复用性。以List接口为例我们可以将String、Integer等类型放入List中如不用泛型存放String类型要写一个List接口存放Integer要写另外一个List接口泛型可以很好的解决这个问题。2.深入泛型 ①定义泛型接口、类 public interface ListE//定义接口指定形参E在这个接口里面E可以作为泛型使用 {void add(E,x);IteratorE iterator();//A... } public interface IteratorE//在这个接口里E可以作为类型使用 {E next();boolean hasNext();... } public interface MapK,V//KV可以作为类型使用 {SetK keySet()//B V put (K key ,V value) ... } 可以发现在A、B处方法声明返回值类型是IterratorE和SetK说明他们是一种特殊的数据类型可以认为是Iterrator和Set类型的子类。 例如使用List类型的时候为E形参传入String实参则产生了一个新的类型ListString把它想象成E全部被String取代的特殊的List子接口。 public interface ListString extends List {void add(String x);IteratorString iterator();... } 这样虽然只是设置了一个ListE接口实际实验时却是可以产生无数多个List 子接口。 【注意】包含泛型声明的类型可以在定义变量、创建对象时传入一个类型实参从而可以动态的生成无数多个逻辑子表但这种子类在物理上并不存在。也就是说ListString不会被替代成ListString系统并没有进行源代码复制。 ②从泛型类派生子类 当定义完泛型接口和泛型父类额时候我们就可以为接口创建实现类或者从父类派生出子类不过使用接口和父类的时候不能再包含类型参数。 //错误演示public class A extends ListE{//A继承ListList不能跟类型形参 } //正确演示1 public class A extends ListString{//A继承List为List的E形参传入String } //正确演示2 public class A extends List{//A继承List也可以不为类型形参传入实际的类型参数不过可能会出现unchecked警告 } ③并不存在泛型类 前面有提到可以把ListString类当成是List的子类这里可能会给大家带来误解实际上系统并没有为ListE生成新的class文件而且也不会把它当成新的类来处理。这里给一个验证 package FanXing;import java.util.ArrayList; import java.util.List;public class ListErr {public static void main(String[] args) {ListString aaa new ArrayList();ListInteger aaa1 new ArrayList();System.out.println(aaa1.getClass()aaa1.getClass());} } 从输出true可以看出不管为泛型的类型形参传入哪一种类型实参对于Java来说他们依然被当做同一个类来处理在内存中也只占用一块内存空间。 3.类型通配符 package FanXing;import java.util.List;public class test {public void test1 (List c){for(int i 0;ic.size();i){System.out.println(c.get(i));}} }  这是一个普通的遍历List集合的代码在编译过程中出现了一个泛型警告因为在这里使用List接口时没有传入实际的参数类型。 修改后 package FanXing;import java.util.List;public class test {public void test1 (List? c){for(int i 0;ic.size();i){System.out.println(c.get(i));}} } 看到原来的List变成了List?这里就引入了类型通配符的概念。 类型通配符就是一个“”它的元素类型可以匹配任何类型。 比如当使用List?时List就成了任何泛型List的父类比如List既是ListString的父类又是ListInteger的父类但是类型之间没有继承关系String是Object的子类ListString不是ListObject的子类。 ①设置类型通配符的上限 格式List? extends XXX它表示所有XXX泛型List的父类 ②设定类型形参的上限 例子 public class ListT extends Number java.io.Serializable {...//表明T类型必须是Number类或者其子类并且必须实现java.io.Serializable接口 } 注意为类型参数指定多个上限时所有的接口上限必须位于类上限之后。 4.泛型方法 格式 修饰符 T,S 返回值类型 方法名 形参列表 {//方法体 } 泛型方法和类型通配符的区别 ①大多数时候都可以用泛型方法来替换通配符②使用通配符情况用来支持灵活的子类化③泛型方法允许类型形参被用来表示方法的一个或多个参数之间的类型依赖关系或者方法返回值与参数之间的类型依赖关系。如果没有这样的类型依赖关系就不应该使用泛型方法。④形参a的类型或返回值的类型依赖于另一个形参b的类型则b的类型声明不应该使用通配符因为使用通配符表示类型b不确定那么a的类型也不能确定这时候要考虑使用泛型方法。⑤类型不被依赖时使用通配符。 泛型方法与方法重载 public class MyUtils {// (1)public static T void copy(CollectionT dest, Collection? extends T src) {...}// (2)public static T T copy(Collection? super T dest, CollectionT src) {...}public static void main(String[] args) {ListNumber ln new ArrayList();ListInteger li new ArrayList();copy(ln, li); // 这里会编译报错} } 允许根据方法参数泛型不同进行方法重载但是调用时如果编译器分不清该调用哪个方法则编译报错上面代码中有两个copy方法调用的时候编译器既可以调用第一个copy 也可以调用第二个copy,这样它就无法确定调用哪个就会引起编译报错。 5.擦除和转换  Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数会被编译器在编译的时候去掉。这个过程就称为类型擦除。如在代码中定义的ListObject和ListString等类型在编译之后都会变成List。JVM看到的只是List而由泛型附加的类型信息对JVM来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方但是仍然无法避免在运行时刻出现类型转换异常的情况。类型擦除也是Java的泛型实现方式与C模板机制实现方式之间的重要区别。 参考链接Java泛型使用详解 【备注1】Java的编译类型和运行类型的理解。 Java的编译时类型是由声明变量时使用的类型决定运行时类型是由实际赋值的对象所决定。参考链接Java的编译类型和运行类型 【备注2】Java泛型中K T V E 分别代表的含义 E – Element (在集合中使用因为集合中存放的是元素) T – TypeJava 类 K – Key键 V – Value值 N – Number数值类型 – 表示不确定的java类型无限制通配符类型参考链接泛型相关 【备注3】为什么说在静态方法、静态初始化块或者静态变量的声明和初始化中不允许使用类型参数。 初步理解 因为泛型是要在对象创建的时候才知道是什么类型的而对象创建的代码执行先后顺序是static的部分然后才是构造函数等等。所以在对象初始化之前static的部分已经执行了如果你在静态部分引用的泛型那么毫无疑问虚拟机根本不知道是什么东西因为这个时候类还没有初始化。因此在静态方法、数据域或初始化语句中为了类而引用泛型类型参数是非法的。  实际原因 静态变量是被泛型类所有实例所共享的。对于声明为MyClassT的类访问其中的静态变量的方法仍然是MyClass.myStaticVar。不管是通过new MyClassString还是new MyClassInteger创建的对象都是共享一个静态变量。假设允许类型参数作为静态变量的类型。那么考虑下面一种情况 MyClassString class1 new MyClassString();MyClassInteger class2 new MyClassInteger();class1.myStaticVar hello;class2.myStaticVar 5; 由于泛型系统的类型擦除(type erasure)。myStaticVar被还原成Object类型然后当调用class1.myStaticVar hello; 编译器进行强制类型转换即myStaticVar (String)hello;接着调用class2.myStaticVar语句时编译器继续进行强制类型转换myStaticVar (Integer)Integer.valueOf(5); 此时myStaticVar是String类型的当然该语句会在运行时抛出ClassCastException异常这样一来存在类型安全问题。因此泛型系统不允许类的静态变量用类型参数作为变量类型。 当然静态泛型方法也不允许。参考链接 有关静态不允许使用类型参数的讨论 为什么类型参数不能作为静态变量的类型 【备注4】Java泛型中上下界限定符extends 和 super的理解 ? extends T表示类型的上界表示参数化类型可能是T或者T的子类 ? super T表示类型的下界表示参数化类型是此类型的超类型父类型直至Object。 PECS原则 如果要从集合中读取类型T的数据并且不能写入可以使用 ? extends 通配符(Producer Extends) 如果要从集合中写入类型T的数据并且不需要读取可以使用 ? super 通配符(Consumer Super) 如果既要存又要取那么就不要使用任何通配符。 【备注5】异常类 异常类一般分为两种异常Exception和错误Error Exception就用trycatchfinally来处理先在try中运行代码catch处理可能出现异常finally是一定会执行到里面的代码。 常见的异常有 NumberFormatException(数字格式异常) IndexOutOfBoundsException(数组越界异常) ArithmeticException(除零异常) RuntimeException(运行时异常) 异常常用的方法 getMessage():返回异常的详细描述字符串。 printStackTrace():跟踪栈详细输出到标准错误输出 printStackTrace(PrintStream s):跟踪栈详细输出到标准错误输出到指定的输出流 getStackTrace():返回异常的跟踪栈信息。 Error一般是由虚拟机造成的系统崩溃的。 下一步学习拓展及计划 1.总结讨论并做成思维导图 2.理解学习中一直提到的异常这一章的内容 3.擦除的实例自己尝试用一个例子实践转载于:https://www.cnblogs.com/zhangqingwang/p/10609987.html
http://www.zqtcl.cn/news/852952/

相关文章:

  • 镇江市住房和城乡建设局网站常州建设网站
  • 学做美食的网站男女做暖暖到网站
  • 手机的网站建设目标刚做的网站 搜不到
  • 重庆网站建设哪里比较好呢ps怎么做网站logo
  • 网站建设五项基本原则优化关键词的公司
  • 高端网站的特点p2p网站开发的流程
  • 什么网站做外贸最好坪地网站建设公司
  • 做网站费用怎么核算没有公司 接单做网站
  • 如何建设一个优秀的电商网站wordpress注册去掉电子邮件
  • 站长工具 seo综合查询长沙高校网站制作公司
  • 杭州网站定制开发哪家好wordpress重置
  • 哈尔滨市建设安全网站火车头更新wordpress
  • 做亚马逊外国网站需要语言好吗邢台seo
  • jsp在网站开发中的优势国内哪个推广网站做的好
  • 做网站工资高吗精品资料
  • 做农业需关注什么网站热门代理项目
  • 网站开发公司营业范围照片制作视频软件app
  • 做网站怎么qq邮箱验证免费拥有wordpress
  • 校园网站建设资金来源有wordpress权重
  • 魔站网站开发wordpress 3.3.1
  • 东莞个人免费建网站网站后台管理系统 asp
  • 呼和浩特网站制作 建设wordpress怎么改中文
  • 银医网站建设方案公司网站模板免费下载
  • 优秀网站设计案例中国网站建设东莞公司
  • 自己的公网ip可以做网站网页设计与制作课程思政建设内容
  • 静态网站 搜索搭建织梦网站教程
  • idc 网站备案手机电脑网站建设短视频
  • 做搜狗pc网站优化快速亚马逊云搭建WordPress
  • 免费的建网站软件2020做seo还有出路吗
  • 宁波三优互动网站建设公司怎么样网站建设公司管理流程图