抽象方法重写,在java中实现不同的返回类型
我有一个抽象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,依此类推 为了实现这一点,并使代码工
FileManager
,它包含三个文件操作方法
openFile()
abstract readFile()
closeFile()
我想指定类FileManager
中的所有三个方法。但是,方法readFile()
必须读取不同类型的文件。即csv
,xls
,doc
。将来,代码甚至可能需要读取PDF
文件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的对象。我从学习材料中复制并粘贴了该示例。你只是想偷我的分数。看看你的答案,你在传递一个参数。。。如果您只是从文档中复制粘贴随机内容,而没有显示这对问题有多大用处,那么无论如何,这是一个糟糕的答案。我认为你的答案是错误的。尝试删除参数,将此方法放在非泛型抽象类上,并在两个子类中使用两种不同的返回类型实现该方法。这是不可能的,试试看。父类必须是泛型的。你所展示的确实存在,但与本例无关