Java中的抽象方法重写:实现不同的返回类型

4

我有一个抽象的Java类 FileManager ,其中包含三种文件操作方法。

  1. openFile()
  2. abstract readFile()
  3. closeFile()

    我想在FileManager这个类中指定所有这三种方法。然而,readFile()方法将不得不读取不同类型的文件,比如csvxlsdoc等。将来代码可能会读取PDF文件。

对于所有这样的调用,返回类型都是不同的。

这意味着当我读取csv文件时,我将返回一个ArrayList,而xls文件则返回一个HashMap,依此类推。

为了实现这一点,并使代码符合工厂规范,我计划在项目中为每种文件类型创建一个单独的读取器类(CSVFileReaderDOCFileReaderXLSFileReader等)。

是否有任何方法,可以强制开发人员在他们的_______(CSV/XLS/DOC)Filereader实现中包括readFile()方法?

附:Java定义子类中重写的方法应该具有与返回类型相同或子类型的返回类型。我的问题是如何在FileManager实现中指定readFile(),并且对于每种不同类型的文件具有不同的返回类型?


请阅读我在被接受的答案中留下的评论。我不认为这是一个好的解决方案,我的解决方案从面向对象编程的角度更有意义。 - Dici
2个回答

1

由于这个问题是关于方法的返回类型,类部分并不相关。为什么不建议另一个方法呢? - kayleighsdaddy
你不必传递一个类型为 T 的对象。我只是从学习材料中复制粘贴了那个例子。你只是想要窃取我的积分。 - kayleighsdaddy
看看你的回答,你正在传递一个参数...如果你只是从文档中随意复制粘贴一些东西,而没有展示这对问题有用,那么这个回答就是不好的。我认为你的回答是错误的。试着移除你的参数,将这个方法放在一个非泛型的抽象类中,并在两个子类中使用两种不同的返回类型实现该方法。这是不可能的,请尝试一下。父类必须是泛型的。你所展示的确实存在,但在这种情况下并不相关。 - Dici

0

只需使用泛型:

public abstract class FileManager<OUPUT> {
    public abstract OUTPUT readFile();
}

public class CSVFileReader extends FileManager<List<String>> {
    @Override
    public List<String> readFile() {
        // ...
    }
}

public class XLSFileReader extends FileManager<Map<String, String>> {
    @Override
    public Map<String, String> readFile() {
        // ...
    }
}

非常感谢,但作为一个到目前为止不熟悉泛型的人,你能告诉我输出是什么吗? - Abhay Sibal
这与其他提供的答案完全相同。 OUPUT 只是我选择的通用类型的名称。另一个答案选择了 T,这也可以,但我更喜欢在可能的情况下为通用类型赋予语义。 - Dici
啊...明白了...完美的答案,正好回答了我的问题。谢谢。 :) - Abhay Sibal
它可能解决你的问题。但是,“FileReader不是一个FileManager”。从面向对象编程的角度来看,这是没有意义的。 - Raman Shrivastava
@RamanShrivastava 什么?OP似乎很满意。虽然名称不一致,但我使用了问题中的名称,并且我认为当我说OP想要子类化FileManager时,我没有错。除了我没有选择的命名之外,你能告诉我在面向对象编程方面这个答案有什么不合理的地方吗? - Dici

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接