某个函数返回的对象,须要由函数调用者执行向下转型 (downcast) 。将向下转型的动做移到函数中。 java
向下转型在Java特别盛行,由于Java没有模板机制,所以若是想从集合之中取出一个对象,就必须进行向下转型。咱们应该尽可能避免使用向下转型。若是某个函数返回一个值,而且返回的对象类型比函数签名所昭告的更特化,即是在函数用户身上强加了非必要的工做。这种状况下,咱们就不该该要求用户承担向下转型的责任,应该尽可能为它们提供准确的类型。这些状况,一般会在返回迭代器或集合的函数身上发生。此时就应该观察这个迭代器被用来干什么,而后针对性地提供专用函数。 函数
1.找出必须对函数调用结果进行向下转型的地方。 spa
这种状况一般出如今返回一个集合或迭代器的函数中 code
2.将向下转型动做搬移到该函数中。 对象
针对返回集合的函数,使用Encapsulate Collection 编译器
下面的例子中,以Reading表示“书籍”。还有一个名为lastReading()的函数,它从一个用于保存Reading对象的vector中返回其最后一个元素: it
Object lastReading(){ return readings.lastElement(); }
咱们应该将这个函数变成: io
Reading lastReading(){ return (Reading)readings.lastElement(); }
当拥有一个集合时,上述那么作就颇有意义。若是“保存Reading对象”的集合被放在Site类中,而且客户端代码以下: 编译
Reading lastReading = (Reading)theSite.readings().lastElement();
咱们就能够再也不把向下转型的工做推给用户,并得以向用户隐藏集合: ast
Reading lastReading = theSite.lastReading();
class Site { ... Reading lastReading(){ return (Reading) readings().lastElement(); } }若是修改函数,将其返回类型改成原返回类型的子类,那就是改变了函数签名,但并不会破坏客户端代码,由于编译器知道它老是能够将一个子类自动向上转型为超类。固然你必须确保这个子类不会破坏超类带来的任何契约。