0

在我的缓存类中,我将有一个函数将对象的序列化版本(未确定的类型)写入文件,如下所示(通用函数):

public <O> void write(O object) {

   // ...
   serialize(file, object);
   // ...

}

效果很好,但是,我无法找到一种方法来创建可以返回任何对象的方法,就像该write()方法可以采用任何对象一样。寻找这样的东西:

public <O> read() {

   // ...
   O object = unserialize(file);
   // ...

   return object;

}

任何关于如何实现这一点的建议都非常感谢!

4

6 回答 6

7

您指定 Object 类型的返回类型:

public Object function(...)

这样,返回类型将始终为 Object 类型(因为所有对象都是 的后代Object),因此它们将被接受。

于 2012-09-02T17:42:56.613 回答
1

如果你的意思是

public <O> O read() {

这几乎没用,因为它与

public Object read() {
于 2012-09-02T17:43:19.503 回答
0

不确定我是否正确理解了这个问题......您可以将这两种方法包装在一个类中并使用对象的类型参数化该类,如下所示:

public class ReaderWriter <T> {
    public ReaderWriter(File file) {...}
    public void write(T object) {...}
    public T read() {...}
}
于 2012-09-02T17:48:01.070 回答
0

我会通过使整个班级通用来做到这一点

class Cache <O extends Serializable> {

    public void write(O object) {
        serialize(file, object);
    }

    public O read() {
        O object = (O)unserialize(file);

        return object;
    }
}

注意返回对象的转换。

除此之外,您应该使用<O extends Serializable>而不仅仅是<O>. 这可确保您的类型参数 id 是可序列化的类型。如果要保存(序列化)对象并防止以后出现错误,则需要这样做。

于 2012-09-02T17:49:09.750 回答
0

我假设 read() 的调用者知道它期望得到哪种类型。这是一个合理的假设,因为他要将返回值分配给某个变量:

MyType o = read(...); // Caller knows he's going to get a MyType object

如果这个假设是真的,那么你应该改变read()方法,让它接受一个类对象:

public<T> T read(Class<T> t) {
   ... 
}

然后调用站点将如下所示:

MyType o = read(MyType.class);
于 2012-09-02T17:54:47.330 回答
0

是的,

public <O> O read()

是有效的并且会做你想做的(返回调用者想要的任何类型)。这是否是一个好主意是另一回事

于 2012-09-03T23:44:17.043 回答