この質問は純粋に学術的なものです (私は C# のバックグラウンドから Java を始めています)。
クラスを拡張してメソッドjava.util.Scanner
を追加するScanner.nextChar()
方法を知りたいです。
Scanner.nextChar()
(答えは に固有のものではなく、ネイティブ クラスを拡張するための一般的な手順に関するものであることに注意してください。よろしくお願いします。)
この質問は純粋に学術的なものです (私は C# のバックグラウンドから Java を始めています)。
クラスを拡張してメソッドjava.util.Scanner
を追加するScanner.nextChar()
方法を知りたいです。
Scanner.nextChar()
(答えは に固有のものではなく、ネイティブ クラスを拡張するための一般的な手順に関するものであることに注意してください。よろしくお願いします。)
Scanner
はfinal
クラスなので、拡張できません。それが非最終クラスになる場合は、それを拡張するだけです。Dennis が示唆したように、このBufferedReader#Read
メソッドを使用して単一の文字を読み取ることができます。
おそらく拡張Reader
してシミュレートしBufferedReader
ますか?
であるため、そのサブクラスを宣言することScanner
はfinal
できません。限目。
おそらく、クラスを変更して修飾子Scanner
を削除できます。final
ただし、これが予約済みパッケージの 1 つにあるという事実は、これを実現するために Java インストールを変更する必要があることを意味します。(bootclasspath を変更することでもできるかもしれませんが、それは同じことになります。)
しかし、正直なところ、 if を変更する必要はあまりありませんScanner
。代わりに、ソース コードを (たとえば、OpenJDK コードベースから) 単純にコピーし、Scanner
それを使用して、追加のメソッドを持つアプリケーションのパッケージ スペースに「関連のない」クラスを作成することができます。タイプ的には実際のScanner
クラスに関連するわけではありませんが、それが問題になることはほとんどありません。
記録のために:
この Q&A - https://stackoverflow.com/a/18746676/139985Scanner
-がサポートしていない考えられる理由をいくつか示しますreadChar
。(もちろん、それは明らかに「意見」であることに注意してください。)
finalにする最も可能性の高い理由Scanner
はセキュリティです。final
Scanner クラスは、Scanner
サンドボックス環境で信頼されていないコードから信頼されているコードにインスタンスを安全に渡すことができることを意味します。
エミュレートするには、空の区切り文字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'