3

这个问题纯粹是学术性的(我从 C# 背景进入 Java)。

我想知道如何扩展java.util.Scanner类以添加Scanner.nextChar()方法。

(请注意,答案可能不是特定于Scanner.nextChar(),而只是扩展本机类的一般步骤。非常感谢。)

4

3 回答 3

3

Scanner是一个final类,你不能扩展它。如果它是一个非最终类,你可以扩展它。正如丹尼斯建议的那样,您可以使用该BufferedReader#Read方法读取单个字符。

也许扩展Reader和模拟一个BufferedReader

于 2013-10-13T00:23:50.763 回答
2

因为Scannerfinal你不能声明它的子类。时期。

  • 反射不起作用/帮助。
  • 字节工程技巧将不起作用/帮助。

可以想象,您可以修改类以Scanner删除final修饰符。但是,这是类在保留包之一中的事实意味着您需要修改Java 安装以实现这一点。(您也可以通过修改引导类路径来做到这一点......但这相当于同一件事。)

不过说实话,如果真的没必要修改Scanner。相反,您可以简单地复制Scanner源代码(例如,来自 OpenJDK 代码库)并使用它在应用程序的包空间中创建一个“不相关”的类,该类具有额外的方法。它不会按类型与真实Scanner类相关,但这不太可能成为问题。


作为记录:

  • 此问答 - https://stackoverflow.com/a/18746676/139985Scanner - 提供了一些不支持的可能原因readChar。(当然要注意这显然是“意见”。)

  • Scanner做出最终决定的最可能原因是安全性。Scanner类final意味着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 回答