2017-04-02 5 views
0

IFrameこれはインターフェイス(変更しないでください)で、フレームは拡張クラスです。キャストのパラメータへの使用

私は、IFrameではなくFrameとしてfを使用するために、キャストまたはインスタンスを使用する必要があります。

どうすればこの問題を解決できますか?

public class Frame implements IFrame{ 
    private int numRows; 
    private char code[][]; 
@Override 
    public void replace(IFrame f) { 
     for (int i=0; i<numRows; i++){ 
      for (int o=0; o<numRows; o++){ 

       (Frame f).code[i][o] = this.code[i][o]; 

       } 
      } 
     } 
    } 
+2

'(フレームf).CODE [I]、[O]、 '? – Leon

+0

それでも私はIDEからエラーが出る –

+0

まあ、配列から要素を取得しているだけですが、何もしません。どのようなエラーが出ますか? – Leon

答えて

0

((Frame) f).code[i][o] = this.code[i][o]は動作するはずですが、私は渡されたパラメータが、実際にキャストエラーを回避するためにコピーする前にFrameのインスタンスである場合は、テストを示唆しています。また、あなたは合格FramenumRowsが呼ばれるインスタンスの1以上であることを確認してください:

public void replace(IFrame f) { 
    for (int i = 0; i < numRows; i++) { 
     for (int o = 0; o < numRows; o++) { 
      ((Frame) f).code[i][o] = this.code[i][o]; 
     } 
    } 
} 

それは次のとおりです。

public void replace(IFrame iFrame) { 
    if (iFrame instanceof Frame) { 
     Frame f = (Frame) iFrame; 
     if (f.numRows < this.numRows) { 
      // Do what you want to do if the provided frame has fewer rows than this frame 
      return; // Return in the if condition, this way you do not proceed to the for loop causing an IndexOutOfBounds exception 
     } 
     for (int i=0; i<numRows; i++){ 
      for (int o=0; o<numRows; o++){ 
        (Frame f).code[i][o] = this.code[i][o]; 
       } 
      } 
     } 
    } 
} 
0

あなたは、キャストのための括弧の別のセットが必要また、例えば、この方法の非常に最初の文でのパラメータの実行時の型を確認することをお勧めして、適切に対応:

if (!(f instanceof Frame)) 
     throw new IllegalArgumentException("Need an instance of Frame. Got an instance of " + f.getClass().getName() + "."); 

パフォーマンスオプト配列複写のverison imized System.arraycopyのを使用することによって達成することができる。

for (int i = 0; i < numRows; i++) { 
    System.arraycopy(this.code[i], 0, ((Frame) f).code[i], 0, numRows); 
} 
関連する問題