2015-09-12 149 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

相關問題