2017年11月4日 星期六

Day2-7 Legal return values 合法回傳型態

1.5 Given a code example, determine if a method is correctly overriding or overloading another method, and identify legal return values (including covariant returns), for the method. 


Return type declaration

Overload return type
複習之前提到有關overload的規則:
- 程式碼因為需要考慮更多有可能傳入的參數,但呼叫者不需要強迫呼叫另外一個名字不相同的method name。所以需要使用overload

- Overload規則如下:
  • 必須變更parameter
  • 可以變更return type
  • 可以變更access modifier
  • 可以宣告新的或範圍更廣的checked exception
  • 可以在subclass和superclass間發生。例如superclass的method: getHeight();而subclass繼承後不改寫superClass的getHeight(),另外寫了一個method: getHeight(int years),這樣也叫做overload
如下範例:

public class Car{
    int run(){return 0;}
}


public class Sedan extends Car{
    String run(int miles) {return null;}
    void run() {}//不合法,沒有修改parameters
}

Sedan override superclass Car的run(),修改了return type變成String及回傳多一個int parameter,但第二個void run(){}是非法的,因為只有修改return type是不合法。

Override, return type及Covariant return
複習之前提到有關override和return type有關的規則:
  • overriding method的parameters必須和original method的相同,如果不同就不叫做overriding,只是寫了一個新的method
  • overriding method的return type必須和original method的相同,或者是subtype (covariant return) 
Covariant: Java 5 的新功能 - 允許override method時return type為original type的subtype,如下範例:


public class Car{
    Car calculateStuff(){ return new Car();}
}

public class Sedan extends Car{
    Sedan calculateStuff(){ return new Sedan();}
}

在Sedan class override calculateStuff()時,回傳type從Car變成subclass Sedan。
在1.4的Java會有錯誤(attempting to use incompatible return type),但在Java 5 Compiler是允許的。

Return value

六大基本注意事項:
  1. Return type如果是Object reference,可以回傳null 
  2. public Sedan calculateStuff() {
     return null;
    }
    
  3. Array可以當作合法return type
  4. public int[] order(){
      return new int[]{1,2,3};
    }
    
  5. return type如果是primitive type,可以回傳 可以隱晦upcast的型態
  6. public int characterNum() {
     char c = 'x';
     return c; //byte<char<int<long<float<double
    }
    
  7. 也可以回傳需要經過downcast的型態
  8. public double miles() {
     double d = 12.3;
     return (float) d;
    }
    
  9. return type如果是void,則不能回傳任何東西 (但最後一行如果只return是可以的!)
  10. public void satHello() {
     return "Hello!"; //illegal
    }
    
  11. return type如果是object reference,可以回傳需要經過downcast或upcast的type
  12. public class Sedan extends Car {
     Car calculateStuff() {
      return new Sedan();
     }
    }
    

    public Object sayHello() {
     return "Hello!"; //illegal
    }
    

    也可以將return type設定為Interface type,回實作interface的class
    public interface OperateCar {}
    public class OperateBMW760i implements OperateCar{}
    
    public class TestCar{
        
        public OperateCar getCar(){
            return new OperateBMW760i();
        }
    }
    

小技巧:
如果是object reference的return type,只要能夠通過IS-A的測驗(或instanceof回傳true),就能夠當作回傳型態。如:

  • OperateBMW760i IS-A OperateCar
  • Sedan IS-A Car
  • String IS-A Object






沒有留言:

張貼留言