2011-03-12 88 views
3

我有一些文件包含對象的日誌。每個文件可以存儲不同類型的對象,但單個文件是同類的 - 它只存儲單一類型的對象。我想編寫一個方法返回這些對象的數組,並使數組具有指定的類型(文件中的對象的類型是已知的,可以作爲參數傳遞)。將返回類型作爲參數傳遞給java?

粗略地說,我要的是類似如下:

public static <T> T[] parseLog(File log, Class<T> cls) throws Exception { 
    ArrayList<T> objList = new ArrayList<T>(); 
    FileInputStream fis = new FileInputStream(log); 
    ObjectInputStream in = new ObjectInputStream(fis); 
    try { 
     Object obj; 
     while (!((obj = in.readObject()) instanceof EOFObject)) { 
      T tobj = (T) obj; 
      objList.add(tobj); 
     } 
    } finally { 
     in.close(); 
    } 
    return objList.toArray(new T[0]); 
} 

上面的代碼不編譯(有一個在return語句錯誤,並在投一個警告),但它應該給你是我想要做什麼的想法。任何建議最好的方式來做到這一點?

+0

我不認爲有可能以編程方式更改返回類型,但是不能在方法中進行相應的轉換調用這個方法? – RoflcoptrException 2011-03-12 00:07:07

回答

4

你不能擁有通用數組,所以只是從你的方法返回的ArrayList:

public static <T> ArrayList<T> parseLog(File log, Class<T> cls) throws Exception { 
     ArrayList<T> objList = new ArrayList<T>(); 
     FileInputStream fis = new FileInputStream(log); 
     ObjectInputStream in = new ObjectInputStream(fis); 
     try { 
      Object obj; 
      while (!((obj = in.readObject()) instanceof EOFObject)) { 
       T tobj = (T) obj; 
       objList.add(tobj); 
      } 
     } finally { 
      in.close(); 
     } 
     return objList; 
    } 

然後,當你知道實際的類型,做演員呢。所以假設你知道T在某個時刻實際上是一個整數,這樣做:

Integer[] array = ((ArrayList<Integer>) myList).toArray(new Integer[myList.size()]); 
+0

我做了這樣的事情。看來你需要用'cls.cast(obj)'替換'(T)obj',因爲類型擦除。 – jonderry 2011-03-12 01:49:55

+0

如果您進行演員表演,您會收到警告,但仍然有效。 – Neil 2011-03-12 13:46:26

1

我看不出這將是一個很好的編程習慣。基本上你試圖說:「我想任意確定返回類型而不犧牲類型安全性。」這有點尷尬。

我會說你最好的選擇只是返回ArrayList<T>而不是數組。

+0

爲什麼這不是很好的編程習慣?什麼是更好的方法來做到這一點?爲什麼要比列表更好地使用列表(調用者是使用數組的舊代碼)? – jonderry 2011-03-12 00:10:38

+0

對於任意返回類型,似乎有些錯誤。我會傳入ArrayList 並添加到它,我自己。 – corsiKa 2011-03-12 00:16:26

+0

'list> array'因爲在Java中數組不能是通用的。 – corsiKa 2011-03-12 00:17:02

相關問題