2010-09-28 44 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); 
    }