2011-09-13 6 views
1
class Rectangle {} 

class ColoredRectangle extends Rectangle {} 

class Base { 
    void foo(Rectangle x) { 
     System.out.println("Base: foo(Rectangle)"); 
    } 
} 

class Sub extends Base { 
    @Override 
    void foo(Rectangle x) { 
     System.out.println("Sub: foo(ColoredRectangle)"); 
    } 
} 

public class WhatHappensHere { 

    public static void main(String[] args) { 
     Sub o = new Sub(); 
     Rectangle rc = new ColoredRectangle(); 

     ((Base) o).foo(rc); 
    } 
} 

(Base) ooの静的タイプを変更すると、私は苦労しています。私はそれがそれを変えないとここで言われたことを覚えています、それはどうしますか?なぜ私はそれをする必要がありますか?どんな条件でどのような目的のために?鋳造 - (ベース)o-実際に何をしていますか?

おかげ

答えて

3

表現oはタイプSubのままであることには、oの静的な型を変更していない - が、発現(Base) oはタイプBaseです。あなたが意味するかもしれないと思うのは、oが指し示すオブジェクトのタイプを変更しないということです。この場合、キャストする目的は全くありませんBaseです。 foo()コールの実行は変更されません。しかし、鋳造が意味をなすさまざまなケースがあります。

+0

を呼び出します.JonSkeetをStringにキャストするのと同じですか? –

+0

Jon Skeetをタイプキャストすることは不可能です –

+0

_God_サブクラスJon Skeetです。 – mre

1

何もしません。他の言語では、これはfooBaseで定義していますが、この場合でも引き続きSub.foo

関連する問題