抽象方法重写,在java中实现不同的返回类型

抽象方法重写,在java中实现不同的返回类型,java,csv,overriding,abstract-class,Java,Csv,Overriding,Abstract Class,我有一个抽象Java类FileManager,它包含三个文件操作方法 openFile() abstract readFile() closeFile() 我想指定类FileManager中的所有三个方法。但是,方法readFile()必须读取不同类型的文件。即csv,xls,doc。将来,代码甚至可能需要读取PDF文件 所有此类调用的返回类型都将不同 这意味着当我读取csv文件时,我将返回一个ArrayList,另一方面,xls文件将返回一个HashMap,依此类推 为了实现这一点,并使代码工

我有一个抽象Java类
FileManager
,它包含三个文件操作方法

  • openFile()
  • abstract readFile()
  • closeFile()

    我想指定类
    FileManager
    中的所有三个方法。但是,方法
    readFile()
    必须读取不同类型的文件。即
    csv
    xls
    doc
    。将来,代码甚至可能需要读取
    PDF
    文件

  • 所有此类调用的返回类型都将不同

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

    为了实现这一点,并使代码工厂兼容,我计划在项目中为每个文件类型创建一个单独的reader类。(
    CSVFileReader
    DOCFileReader
    XLSFileReader
    等)

    有没有办法,我可以强制开发人员在他的_____(CSV/XLS/DOC)文件读取器实现中包含
    readFile()
    方法

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

    只需使用泛型:

    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() {
            // ...
        }
    }
    
    公共抽象类文件管理器{
    公共摘要输出readFile();
    }
    公共类CSVFileReader扩展了FileManager{
    @凌驾
    公共列表读取文件(){
    // ...
    }
    }
    公共类XLSFileReader扩展了FileManager{
    @凌驾
    公共地图读取文件(){
    // ...
    }
    }
    
    您希望用作返回类型。这将允许您动态选择返回类型

    public <T> T mymethod(T type)
    {
      return type;
    }
    
    publicmythod(T类型)
    {
    返回类型;
    }
    
    下面是一个关于Oracle在java中使用泛型类型的简短教程。

    请阅读我在已接受答案上留下的评论。我不认为这是一个好的解决方案,我提出的解决方案从面向对象的角度来看更有意义。非常感谢,但是作为一个不熟悉泛型(到目前为止)的人,你能告诉我输出是什么吗?它与提供的另一个答案完全相同
    output
    只是我选择的泛型类型的名称。另一个答案选择了
    T
    ,这没关系,但我更喜欢在可能的情况下给泛型类型一个语义……明白了……完美的答案,准确地回答了我的问题。谢谢。:)它可能会解决你的问题。但“FileReader不是文件管理器”。从OOP的角度看,这毫无意义。@RamanShrivastava什么?OP似乎很满意。名称不一致,但我采用了问题中的名称,当我说OP想要子类化
    FileManager
    时,我认为我没有错。你能告诉我,除了我没有选择的命名之外,在这个答案的OOP观点中还有什么是没有意义的?因为问题是关于方法中的返回类型。课程部分不相关。你为什么不建议另一种方法呢?你不必传递类型为t的对象。我从学习材料中复制并粘贴了该示例。你只是想偷我的分数。看看你的答案,你在传递一个参数。。。如果您只是从文档中复制粘贴随机内容,而没有显示这对问题有多大用处,那么无论如何,这是一个糟糕的答案。我认为你的答案是错误的。尝试删除参数,将此方法放在非泛型抽象类上,并在两个子类中使用两种不同的返回类型实现该方法。这是不可能的,试试看。父类必须是泛型的。你所展示的确实存在,但与本例无关