2017-11-14 1 views
1

私はこの(propably)シンプルなキャスティングの例で扱いにくい問題があります。手伝っていただけませんか?ジレンマをキャストするインターフェイス

public class Example1 { 

interface ParentIf{} 
interface ChildIf extends ParentIf {} 
interface OtherIf {} 

class ParentCl {} 
class ChildCl extends ParentCl {} 
class OtherCl {} 

    public static void main(String[] args) { 
     ChildIf cI = null; 
     ParentIf pI = null; 
     OtherIf oI = null; 
     ChildCl cC = null; 
     ParentCl pC = null; 
     OtherCl oC = null; 

     cI = (ChildIf)oI; //case1 - fine 

     cC = (ChildCl)oC; //case2 - inconvertible types 

     cI = (ChildIf)oC; //case3 - fine 
    } 
} 

しかし、他の2つのステートメントがうまくいかない理由はわかりません。

OtherIfとChildIfの間の接続が見つかりません。では、CaseIの2つのインターフェースの間に "extend"がない場合、ChildIfにOtherIfをキャストする方法はありますか?

答えて

2
cI = (ChildIf)oI; 

oIはChildIfとOtherIfの両方を実装するクラスのインスタンスである可能性があるため、微細です。

cI = (ChildIf)oC; 

oCOtherClass ANECはChildIfを実装拡張するクラスのインスタンスである可能性があるため、微細です。

+0

私はまだちょっと混乱しています。 「できます」とは、この時点で、ChildIfとOtherIfの両方を実装するクラスのインスタンスではありませんが、IntelliJはそれが可能であることを「知っていますか?申し訳ありません私はそれを見ることができません:/ – vviston

+1

oIは、 'OtherIf'型のオブジェクトを参照する変数です。コンパイラは、実行時にオブジェクトの具体的な型を気にしません。それは、変数の宣言された型を気にします:OtherIf。型がChildIfとOtherIfの両方を実装することは可能ですか?はい、可能です。だからキャストは成功するかもしれないので意味があります。 –

関連する問題