2010-09-28 45 views
4

我是Java中的新手,所以我不確定這是否可能。基本上我需要將一個文件反序列化成給定類型的對象。基本上,該方法將做到這一點:在Android中使用泛型Java代碼

FileInputStream fis = new FileInputStream(filename); 
    ObjectInputStream in = new ObjectInputStream(fis); 
    MyClass newObject = (MyClass)in.readObject(); 
    in.close(); 
    return newObject; 

我想這個方法是通用的,所以我可以告訴它我想要什麼類型in.readObject()其輸出投進去,並將其返回。

希望這是有道理的......然後,我可能沒有正確理解泛型,這實際上不可行或不可取。

感謝, D.

+0

我沒有嘗試過什麼真正的 - 不知道從哪裏開始/ – codedog 2010-09-28 08:34:19

回答

7

我不知道關於Android(或任何限制,它可能有),但在Java中,你可以做這樣的事情:

public static <T> T getObject(String filename) throws IOException, ClassNotFoundException { 
    FileInputStream fis = new FileInputStream(filename); 
    ObjectInputStream in = new ObjectInputStream(fis); 
    T newObject = (T) in.readObject(); 
    in.close(); 
    return newObject; 
} 

然後調用它像

MyClass myObj = getObject("in.txt"); 

這雖然給你一個unchecked投警告,因爲編譯器不能確定你可以施放收到所提供的對象類型,所以它不完全型安全。您需要確保您從輸入流中獲得的內容實際上可以轉換爲該類,否則將得到ClassCastException。您可以通過註釋與@SuppressWarnings("unchecked")

+0

神奇!這甚至更加整潔,而且它的工作! :o)非常感謝! – codedog 2010-09-28 09:04:30

+0

真棒,MyClass需要什麼接口或構造函數來工作 – schwiz 2010-09-28 17:57:33

+0

嗯,它基本上只是一個演員。因此,無論輸入流需要什麼,仍然需要使用Object而不是T。但是沒有添加接口或構造函數的新要求。 – 2010-09-29 08:23:50

1

的方法抑制警告已經剛剛看到這個How do I make the method return type generic?我會嘗試以下方法:

public <T> T deserialiseObject(String filename, Class<T> type) 
      throws StreamCorruptedException, IOException, 
      ClassNotFoundException { 
     FileInputStream fis = new FileInputStream(filename); 
     ObjectInputStream in = new ObjectInputStream(fis); 
     Object newObject = in.readObject(); 
     in.close(); 
     return type.cast(newObject); 
    }