解决方案 »

  1.   

    代码的第132行:Employee ee = it.next();
    出现了问题报错的,报错的内容是:
    不兼容的类型:Object无法转换为Employee
      

  2.   

    需要强制类型转换
    (Employee)it.next()
      

  3.   

    我知道需要强制装换,但是为什么需要强制转换呢?使用it.next()不是可以得到它真正的类型吗?为什么说是Object,我在上面用了泛型啊
      

  4.   


    我找了一下API文档,文档对于这个函数是这样描写的:
    Iterator<E>  iterator()
    Returns an iterator over the elements in this collection.前面不是带了一个E吗?
      

  5.   

    1.首先Iterator里面的元素,初始肯定是Object类型的(不然你怎么往里面放对象进去?),正因为所有类都继承Object,它才可以安全的被放在"Iterator里面",没有什么特殊操作的话,里面的类型不会变吧~第二,如果因为你填充类Employee的几个实例(包括子类实例)进去,按照你的意思,假如它自动帮你在内部已经转型好了,那么假如还有个Employee的父类的实例要放进去,那么这里除非投放进去时弄向下转型,否则不能放进去吧~
    第三,初学的话,不要钻的那么深,这种精神是好,但是等你把面扩大点,工作后再来玩这些更合适.目前的话,多熟悉api吧,能够熟练运用即可,如果要玩深点的话,这问题涉及到java的设计了吧(我的认为),默认返回Object类型,一定意义上是为了确保安全.
    相对的,把注意力弄到代码上,比如下面的一些mistakes
    稍微改进了点东西,比如每次循环你就别再new一个ee了,让他重新指向新对象即可
    for循环在这里,while更合适,因为for的三个表达式貌似没有充分用到,Iterator一般用这样的形式.
    Iterator it = al.iterator(); 
        Employee ee = null;
        while(it.hasNext())
        {
            ee = (Employee) it.next();        if (ee instanceof SalariedEmployee)
            {
                overtimeCost += SalariedEmployee.overtimeSalary;
            } else if (ee instanceof BasePlusSalesEmployee)
            {
                overtimeCost += BasePlusSalesEmployee.overtimeSalary;
            }
        }
      

  6.   

    有道理,确实每次都创建了一个新的引用变量ee影响效率。不能内部转换好的话,那我觉得这个版本的Java对“类型推断”处理的还不是很好啊,上数学课《形式化方法》使用COQ直接可以类型推断。记得有个科学家就是证明了类型推断拿了诺贝尔奖。谢谢你,精辟的回复!!