3

この質問は純粋に学術的なものです (私は C# のバックグラウンドから Java を始めています)。

クラスを拡張してメソッドjava.util.Scannerを追加するScanner.nextChar()方法を知りたいです。

Scanner.nextChar()(答えは に固有のものではなく、ネイティブ クラスを拡張するための一般的な手順に関するものであることに注意してください。よろしくお願いします。)

4

3 に答える 3

3

Scannerfinalクラスなので、拡張できません。それが非最終クラスになる場合は、それを拡張するだけです。Dennis が示唆したように、このBufferedReader#Readメソッドを使用して単一の文字を読み取ることができます。

おそらく拡張ReaderしてシミュレートしBufferedReaderますか?

于 2013-10-13T00:23:50.763 に答える
2

であるため、そのサブクラスを宣言することScannerfinalできません。限目。

  • リフレクションは機能しません/役に立ちません。
  • バイトエンジニアリングのトリックは機能しません/役に立ちません。

おそらく、クラスを変更して修飾子Scannerを削除できます。finalただし、これが予約済みパッケージの 1 つにあるという事実は、これを実現するために Java インストールを変更する必要があることを意味します。(bootclasspath を変更することでもできるかもしれませんが、それは同じことになります。)

しかし、正直なところ、 if を変更する必要はあまりありませんScanner。代わりに、ソース コードを (たとえば、OpenJDK コードベースから) 単純にコピーし、Scannerそれを使用して、追加のメソッドを持つアプリケーションのパッケージ スペースに「関連のない」クラスを作成することができます。タイプ的には実際のScannerクラスに関連するわけではありませんが、それが問題になることはほとんどありません。


記録のために:

  • この Q&A - https://stackoverflow.com/a/18746676/139985Scanner -がサポートしていない考えられる理由をいくつか示しますreadChar。(もちろん、それは明らかに「意見」であることに注意してください。)

  • finalにする最も可能性の高い理由Scannerはセキュリティです。finalScanner クラスは、Scannerサンドボックス環境で信頼されていないコードから信頼されているコードにインスタンスを安全に渡すことができることを意味します。

于 2013-10-13T00:53:27.283 に答える
1

エミュレートするには、空の区切り文字nextCharを使用してみてください。next

Scanner s = new Scanner("a\nb\tcd\re");
Pattern original = s.delimiter();// in case you wnat to get back to
                                // default delimiter

s.useDelimiter("");

while (s.hasNext()) {
    char c = s.next().charAt(0);
    System.out.println("'" + c + "'");
}

結果

'a'
'      (here is printed value of `\n`) 
'
'b'
'   '  (here is printed value of `\t`) 
'c'
'd'
'      (here is printed value of `\r`) 
'
'e'
于 2013-10-13T00:30:33.040 に答える