【问题标题】:object of type Reader referencing BufferedReader object can't access method readLine()引用 BufferedReader 对象的 Reader 类型的对象无法访问方法 readLine()
【发布时间】:2019-09-14 17:16:24
【问题描述】:

以下代码给出了找不到 readLine() 方法的错误。 但是,如果我将 readLine() 替换为 read() 并相应地进行一些更改,它就会起作用。

import java.io.*;
class Console {
public static void main (String[] args) throws IOException {
Reader in = null;
String c;
try {
      in = new BufferedReader (new InputStreamReader(System.in));
       System.out.println("type 'quit' to quit!");
      do { 
              c=in.readLine();
              System.out.println(c);
            } while(!c.equals("quit");
        } finally {
               if(in!=null) in.close();
         }
   }
 }

这里哪部分有问题?

【问题讨论】:

  • 另外,使用 try-with-resources 而不是自己关闭阅读器。
  • 是什么让你认为它会起作用?
  • @user207421,因为 read() 有效!而且我看不出这两种方法之间有任何根本区别。所以如果一个工作,另一个应该工作,不是吗?
  • “这两种方法的根本区别”是 readLine() 没有在 Reader 中声明,只要看一眼 Javadoc 就会发现。

标签: java bufferedreader reader


【解决方案1】:

您应该将您的“in”声明为 BufferedReader,而不是 Reader:

BufferedReader in = null;

Reader 接口不存在 readLine() 方法。

read() 方法在 Reader 接口中定义,因此任何扩展/实现它的接口或类也将具有 read() 方法。 但是 readLine() 方法仅在 BufferedReader 接口中定义。即使声明为 Reader 的对象在运行时恰好是 BufferedReader 的实例,在编译时也会出现错误,因为只有声明的类型很重要。

【讨论】:

  • 我知道如果我将它声明为 BufferedReader 它会起作用,但我只是想知道为什么它在给定的代码中不起作用,因为 BufferedReader 是 Reader 的子类,它会覆盖 read() 为以及 readLine() 方法。为什么 read() 有效而 readLine() 无效。这就是我想知道的。
  • 查看我编辑的答案。我不确定您有什么不清楚的地方,但 ReadLine() 方法对于 Reader 接口不存在
  • 是的,先生,我明白了。我应该找对地方了。我只是在看 BufferedReader。谢谢。
猜你喜欢
  • 2020-07-31
  • 2013-05-03
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
相关资源
最近更新 更多