返回任何类型的对象

时间:2012-09-02 17:40:35

标签: java oop generics

在我的缓存类中,我将有一个函数将对象的序列化版本(未定义类型)写入文件,类似这样(泛型函数):

public <O> void write(O object) {

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

}

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

public <O> read() {

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

   return object;

}

有关如何实现这一目标的任何建议都非常感谢!

6 个答案:

答案 0 :(得分:6)

指定Object类型的返回类型:

public Object function(...)

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

答案 1 :(得分:1)

如果你的意思是

public <O> O read() {

这几乎没用,因为它与

大致相同
public Object read() {

答案 2 :(得分:0)

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

public class ReaderWriter <T> {
    public ReaderWriter(File file) {...}
    public void write(T object) {...}
    public T read() {...}
}

答案 3 :(得分: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是可序列化的类型。如果要保存(序列化)对象并防止以后出现错误,则需要这样做。

答案 4 :(得分: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);

答案 5 :(得分:0)

是,

public <O> O read()

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