2015-09-12 87 views
4

我有一个抽象的Java类FileManager,它包含三种文件操作方法。抽象方法覆盖,在java中实现不同的返回类型

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

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

所有这些调用的返回类型将有所不同。

这意味着当我读取csv文件时,我将返回一个ArrayList,另一方面xls文件将返回一个HashMap,依此类推。为了实现这一点,并使代码工厂兼容,我计划在每个文件类型的项目中制作一个单独的阅读器类。 (CSVFileReaderDOCFileReaderXLSFileReader等)

有什么办法,在那里我可以强制开发者可以在他的______(CSV/XLS/DOC)的FileReader实施readFile()方法? PS:Java定义了子类中的重写方法应该具有相同或返回类型的子类型。我的问题是如何在FileManager实现中指定readFile(),并且对于每种不同类型的文件也有不同的返回类型?

+0

请阅读我在接受的答案上留下的评论。我不相信这是一个好的解决方案,我提出的解决方案在OOP的角度更有意义 – 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() { 
     // ... 
    } 
} 
+0

非常感谢,但作为一个不熟悉泛型的人(至今),请您告诉OUTPUT是什么? –

+0

这与其他提供的答案完全相同。 'OUPUT'只是我选择的通用类型的名称。另一个答案选择'T',这是没问题的,但我更喜欢在可能的情况下给出泛型类型的语义 – Dici

+0

啊......知道了答案。完美答案,正确回答我的问题。谢谢。 :) –

1

你想作为返回类型使用。这会让你随时挑选返回类型。

public <T> T mymethod(T type) 
{ 
    return type; 
} 

以下是关于在Oracle中使用Java的泛型类型的简要教程。 https://docs.oracle.com/javase/tutorial/java/generics/types.html

+0

原因问题是关于方法中的返回类型。班级部分不相关。你为什么不建议另一种方法。 – kayleighsdaddy

+0

您不必传递类型T的对象。我从学习资料中复制并粘贴该示例。你只是想窃取我的观点。 – kayleighsdaddy

+0

看看你的答案,你传递了一个参数......如果你只是从文档中复制粘贴任意东西而没有显示这对问题有用,那么这是一个不好的答案。我保持你的答案是错误的。尝试删除参数,将此方法放在非通用抽象类上,然后在两个子类中实现具有两种不同返回类型的方法。这是不可能的,试试吧。父类必须是通用的。你所表明的确存在,但在这种情况下不相关 – Dici

相关问题