2016-09-04 9 views
0

私は夜のプログラミングを過ごしているうちにこれに来ました。メソッド呼び出しの問題

//Reader class isn't java.io but it's from third party library 
public class ACR122U extends Reader { 
     // This method is called from outside 
     // This method overrides method of the Reader class 
     @Override 
     public void open(UsbDevice device) { 
     new OpenTask().execute(device); 
     } 

    private class OpenTask extends AsyncTask<UsbDevice, Void, Exception> { 
    @Override 
    protected Exception doInBackground(UsbDevice... params) { 
     Exception result = null; 

     try { 
     // There the problem (recursion) happens 
     // I don't want to call ACR122U.open() but Reader.open() 
     // I cannot call super.open() /super of OpenTask class is AsyncTask/ 
     open(params[0]); 
     } catch (Exception e) { 
     result = e; 
     } 

     return result; 
    } 
    } 
} 

open()メソッドの名前を変更せずに問題を解決できるかどうかは疑問です。

PS:初心者はこちらです。

+0

あなたが達成しようとしていることは、コードの途中でコメントに埋もれていることは本当に役に立ちません。私はあなたの質問を、理想的にはより単純な状況(USBやタスクの関与なし)で書き直し、あなたが達成しようとしていることを説明することを強くお勧めします。 –

+0

[なぜsuper.super.method()ですか? Javaで許可されていないのですか?](http://stackoverflow.com/questions/586363/why-is-super-super-method-not-allowed-in-java) –

+0

'open()'メソッドの規約が'open()'メソッドからの復帰時に 'Reader'がオープンされるためには、あなたはその契約に違反しています。呼び出し側は、 'open()'の呼び出しの後に 'Reader'がオープンしていることを期待して、' Reader'を*使用するようになりますが、将来の未定義の時間まで実際のオープン操作を延期しています。コードがクラッシュします。呼び出し側はいつ 'Reader 'が使用できる状態になるのを期待するべきですか? – Andreas

答えて

0

あなたが何をしたいの構文は次のとおりです。ただし

ACR122U.super.open(params[0]); 

、あなたはおよそjava.io.Readerを話している場合、これはReaderクラスがopen()メソッドを定義していないので、仕事に行くのではありません。確かにopen(UsbDevice)メソッドではありません。

+0

あなたは 'Reader'が組み込みの[' ' java.io.Reader'](https://docs.oracle.com/javase/7/docs/api/java/io/Reader.html)を参照してください。私はそれがまったく違うものであることをかなり確信しています。そうでなければ、 '@ Override'でコンパイルしません。 – Andreas

+0

@アンドレアス - うん、私はそれを認識したので、私はあなたのコメントを投稿した直前に私の答えを更新したのです。 –

+0

ありがとう:)それは今働きます。 私はReaderがjavo.ioではなくサードパーティ製のライブラリであると書いたはずです。 それを編集するつもりです。 –

関連する問題