知识大全 类型未知

Posted 类型

篇首语:炒沙作縻终不饱,缕冰文章费工巧。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 类型未知相关的知识,希望对你有一定的参考价值。

Java集合的缺点:类型未知  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  使用Java集合的 缺点 是在将对象置入一个集合时丢失了类型信息 之所以会发生这种情况 是由于当初编写集合时 那个集合的程序员根本不知道用户到底想把什么类型置入集合 若指示某个集合只允许特定的类型 会妨碍它成为一个 常规用途 的工具 为用户带来麻烦 为解决这个问题 集合实际容纳的是类型为Object的一些对象的句柄 这种类型当然代表Java中的所有对象 因为它是所有类的根 当然 也要注意这并不包括基本数据类型 因为它们并不是从 任何东西 继承来的 这是一个很好的方案 只是不适用下述场合   ( ) 将一个对象句柄置入集合时 由于类型信息会被抛弃 所以任何类型的对象都可进入我们的集合——即便特别指示它只能容纳特定类型的对象 举个例子来说 虽然指示它只能容纳猫 但事实上任何人都可以把一条狗扔进来   ( ) 由于类型信息不复存在 所以集合能肯定的唯一事情就是自己容纳的是指向一个对象的句柄 正式使用它之前 必须对其进行造型 使其具有正确的类型     值得欣慰的是 Java不允许人们滥用置入集合的对象 假如将一条狗扔进一个猫的集合 那么仍会将集合内的所有东西都看作猫 所以在使用那条狗时会得到一个 违例 错误 在同样的意义上 假若试图将一条狗的句柄 造型 到一只猫 那么运行期间仍会得到一个 违例 错误   下面是个例子     //: CatsAndDogs java  // Simple collection example (Vector)  import java util *;    class Cat    private int catNumber;   Cat(int i)     catNumber = i;      void print()     System out println( Cat # + catNumber);         class Dog    private int dogNumber;   Dog(int i)     dogNumber = i;      void print()     System out println( Dog # + dogNumber);         public class CatsAndDogs    public static void main(String[] args)     Vector cats = new Vector();    for(int i = ; i < 7; i++)     cats.addElement(new Cat(i));    // Not a problem to add a dog to cats:    cats.addElement(new Dog(7));    for(int i = 0; i < cats.size(); i++)     ((Cat)cats.elementAt(i)).print();    // Dog is detected only at run-time      ///:~    可以看出,Vector的使用是非常简单的:先创建一个,再用addElement()置入对象,以后用elementAt()取得那些对象(注意Vector有一个size()方法,可使我们知道已添加了多少个元素,以便防止误超边界,造成违例错误)。WINgwIt.cOm  Cat和Dog类都非常浅显——除了都是“对象”之外,它们并无特别之处(倘若不明确指出从什么类继承,就默认为从Object继承。所以我们不仅能用Vector方法将Cat对象置入这个集合,也能添加Dog对象,同时不会在编译期和运行期得到任何出错提示。用Vector方法elementAt()获取原本认为是Cat的对象时,实际获得的是指向一个Object的句柄,必须将那个对象造型为Cat。随后,需要将整个表达式用括号封闭起来,在为Cat调用print()方法之前进行强制造型;否则就会出现一个语法错误。在运行期间,如果试图将Dog对象造型为Cat,就会得到一个违例。  这些处理的意义都非常深远。尽管显得有些麻烦,但却获得了安全上的保证。我们从此再难偶然造成一些隐藏得深的错误。若程序的一个部分(或几个部分)将对象插入一个集合,但我们只是通过一次违例在程序的某个部分发现一个错误的对象置入了集合,就必须找出插入错误的位置。当然,可通过检查代码达到这个目的,但这或许是最笨的调试工具。另一方面,我们可从一些标准化的集合类开始自己的编程。尽管它们在功能上存在一些不足,且显得有些笨拙,但却能保证没有隐藏的错误。     1. 错误有时并不显露出来    在某些情况下,程序似乎正确地工作,不造型回我们原来的类型。第一种情况是相当特殊的:String类从编译器获得了额外的帮助,使其能够正常工作。只要编译器期待的是一个String对象,但它没有得到一个,就会自动调用在Object里定义、并且能够由任何Java类覆蓋的toString()方法。这个方法能生成满足要求的String对象,然后在我们需要的时候使用。  因此,为了让自己类的对象能显示出来,要做的全部事情就是覆蓋toString()方法,如下例所示:    //: WorksAnyway.java  // In special cases, things just seem  // to work correctly.  import java.util.*;    class Mouse    private int mouseNumber;   Mouse(int i)     mouseNumber = i;      // Magic method:   public String toString()     return "This is Mouse #" + mouseNumber;      void print(String msg)     if(msg != null) System.out.println(msg);    System.out.println(     "Mouse number " + mouseNumber);         class MouseTrap    static void caughtYa(Object m)     Mouse mouse = (Mouse)m; // Cast from Object    mouse.print("Caught one!");         public class WorksAnyway    public static void main(String[] args)     Vector mice = new Vector();    for(int i = 0; i < 3; i++)     mice.addElement(new Mouse(i));    for(int i = 0; i < mice.size(); i++)      // No cast necessary, automatic call     // to Object.toString():     System.out.println(      "Free mouse: " + mice.elementAt(i));     MouseTrap.caughtYa(mice.elementAt(i));          ///:~    可在Mouse里看到对toString()的重定义代码。在main()的第二个for循环中,可发现下述语句:    System.out.println("Free mouse: " +  mice.elementAt(i));    在“+”后,编译器预期看到的是一个String对象。elementAt()生成了一个Object,所以为获得希望的String,编译器会默认调用toString()。但不幸的是,只有针对String才能得到象这样的结果;其他任何类型都不会进行这样的转换。  隐藏造型的第二种方法已在Mousetrap里得到了应用。caughtYa()方法接收的不是一个Mouse,而是一个Object。随后再将其造型为一个Mouse。当然,这样做是非常冒失的,因为通过接收一个Object,任何东西都可以传递给方法。然而,假若造型不正确——如果我们传递了错误的类型——就会在运行期间得到一个违例错误。这当然没有在编译期进行检查好,但仍然能防止问题的发生。注意在使用这个方法时毋需进行造型:  MouseTrap.caughtYa(mice.elementAt(i));     2. 生成能自动判别类型的Vector    大家或许不想放弃刚才那个问题。一个更“健壮”的方案是用Vector创建一个新类,使其只接收我们指定的类型,也只生成我们希望的类型。如下所示:    //: GopherVector.java  // A type-conscious Vector  import java.util.*;    class Gopher    private int gopherNumber;   Gopher(int i)     gopherNumber = i;      void print(String msg)     if(msg != null) System.out.println(msg);    System.out.println(     "Gopher number " + gopherNumber);         class GopherTrap    static void caughtYa(Gopher g)     g.print("Caught one!");         class GopherVector    private Vector v = new Vector();   public void addElement(Gopher m)     v.addElement(m);      public Gopher elementAt(int index)     return (Gopher)v.elementAt(index);      public int size() return v.size();    public static void main(String[] args)     GopherVector gophers = new GopherVector();    for(int i = 0; i < 3; i++)     gophers.addElement(new Gopher(i));    for(int i = 0; i < gophers.size(); i++)     GopherTrap.caughtYa(gophers.elementAt(i));      ///:~    这前一个例子类似,只是新的GopherVector类有一个类型为Vector的private成员(从Vector继承有些麻烦,理由稍后便知),而且方法也和Vector类似。然而,它不会接收和产生普通Object,只对Gopher对象感兴趣。  由于GopherVector只接收一个Gopher(地鼠),所以假如我们使用:  gophers.addElement(new Pigeon());  就会在编译期间获得一条出错消息。采用这种方式,尽管从编码的角度看显得更令人沉闷,但可以立即判断出是否使用了正确的类型。  注意在使用elementAt()时不必进行造型——它肯定是一个Gopher。     3. 参数化类型    这类问题并不是孤立的——我们许多时候都要在其他类型的基础上创建新类型。此时,在编译期间拥有特定的类型信息是非常有帮助的。这便是“参数化类型”的概念。在C++中,它由语言通过“模 cha138/Article/program/Java/JSP/201311/19706

相关参考

管理者积极探索环境与组织自身发展中的未知领域,开拓和创新组织发展新局面的思维活动就是创新思维

管理者积极探索环境与组织自身发展中的未知领域,开拓和创新组织发展新局面的思维活动就是创新思维。_____答案:正确解析:现代管理中的创新思维,是指管理者积极探索环境与组织自身发展中的未知领域开拓和创建

构成我们学习上最大障碍的,不是未知的东西,而是已知的东西。这句话的含义是:__

构成我们学习上最大障碍的,不是未知的东西,而是已知的东西。这句话的含义是:_____A、“已知的东西”不是一劳永逸的,只有经常学习,才能获得新知B、对“已知的东西”学得不好,理解不深就会构成学习上的障

知识大全 ios4.3.3未越狱,已经备份5.1.1shsh 升级固件始终发生未知错误3194,用很多办法都不见效,求救啊

ipone4ios4.3.3未越狱,已经备份5.1.1shsh升级固件始终发生未知错误3194,用很多办法都不见效,求救啊!昨日拿到一iPad1看到固件是3.2,于是准备升级到最新的5.1.1.但是使

知识大全 总体X服从正态分布N(μ,σ2),其中σ2未知,x1,x2,…,xn为来自该总体的样本,

总体X服从正态分布N(μ,σ2),其中σ2未知,x1,x2,…,xn为来自该总体的样本,  以下文字资料是由(本站网www.cha138.com)小编为大家搜集整理后发布

知识大全 三星手机无法安装应用程序,安装时显示未安装应用程序,设置中未知来源的选项已勾选,请问是出了什么问题

三星手机无法安装应用程序,安装时显示未安装应用程序,设置中未知来源的选项已勾选,请问是出了什么问题估计是软件的问题,或者手机没有root装的软件需要root权限你好三星手机无法安装,显示为应用程序未安

发挥创造性,离不开求异思维。所谓求异思维,就是指注重已知与未知之间的矛盾,揭示现象与本质间的差别。它要求对公认为是完美无

发挥创造性,离不开求异思维。所谓求异思维,就是指注重已知与未知之间的矛盾,揭示现象与本质间的差别。它要求对公认为是完美无缺的定论持怀疑和批评态度,富于挑战性地对待传统和习惯的思维模式。正如李四光所说:

在中,梦美丽的彩绘中,每个人都怀揣着自己憧憬的梦想。科学家的梦想是探索未知的领域以造福人类。运动员的梦想是夺得金牌为国家

在中,梦美丽的彩绘中,每个人都怀揣着自己憧憬的梦想。科学家的梦想是探索未知的领域以造福人类。运动员的梦想是夺得金牌为国家争得荣誉。学生的梦想是不断的学习和掌握更多的知识和本领,以更大的能力投身和建设美

依据GB/T18664-2002《呼吸防护用品的选择、使用与维护》,进入缺氧(O2<18%)、空气污染物浓度未知等环境时,应选择的呼吸防护用品是( )

依据GB/T18664-2002《呼吸防护用品的选择、使用与维护》,进入缺氧(O2A.全面罩的正压式携气式B.半面罩的正压式携气式C.全面罩的正压式供气式D.半面罩的正压式供气式答案:A【知识点】常用

依据GB/T18664-2002《呼吸防护用品的选择、使用与维护》,进入缺氧(O2<18%)、空气污染物浓度未知等环境时,应选择的呼吸防护用品是( )

依据GB/T18664-2002《呼吸防护用品的选择、使用与维护》,进入缺氧(O2A.全面罩的正压式携气式B.半面罩的正压式携气式C.全面罩的正压式供气式D.半面罩的正压式供气式答案:A【知识点】常用

知识大全 今天就要,急

求几道数学应用题的数量关系式!今天就要,急!1.这种问题可以设未知量,也可以不设,下面用设未知量的方法求解:设每小时行驶a,全程为b,则第一问3a=3/5b,解得a=1/5b,即每小时行驶全程的1/5