有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何扩展java。util。Scanner类添加nextChar()方法?

这个问题纯粹是学术性的(我是从C#背景开始学习Java的)

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

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


共 (3) 个答案

  1. # 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'
    
  2. # 2 楼答案

    因为Scannerfinal,所以不能声明它的子类。句号

    • 反思没用
    • 字节工程技巧不起作用

    可以想象,您可以修改这个Scanner类来删除final修饰符。然而,事实上,这个is类位于一个保留的包中,这意味着您需要修改Java安装来实现这一点。(您也可以通过修改bootclasspath来实现这一点……但这相当于一件事。)

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


    记录在案:

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

    • 使Scanner成为最终版本的最可能原因是安全性。finalScanner类意味着Scanner实例可以在沙盒环境中安全地从不受信任的代码传递到受信任的代码

  3. # 3 楼答案

    ^{}是一个final类,不能扩展它。如果这是一门非最终课程,你可以扩展它。正如Dennis所建议的,可以使用^{}方法读取单个字符

    也许扩展^{}并模拟BufferedReader