2012-09-02 114 views
0

的對象在我緩存類,我要具有把對象(未定類型)的序列化版本到一個文件中,這樣的事情(通用功能)功能:返回任何類型的

public <O> void write(O object) { 

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

} 

偉大的工程,但是,我無法找到一個方法來創建一個方法,它可以返回任何對象,像write()方法可以採取任何對象。尋找這樣的事情:

public <O> read() { 

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

    return object; 

} 

有關如何完成此任何建議,高度讚賞!

+0

你有編譯問題嗎?或者你問如何在運行時創建一個通用實例? – Vitaliy

+0

p.s.你的'write'可以寫成'public void write(Object object)' – user102008

回答

5

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

public Object function(...) 

這樣的返回類型永遠是Object類型的(因爲所有的對象都是Object後裔),所以他們會被接受。

1

如果你的意思

public <O> O read() { 

這幾乎是無用的,因爲它是一樣一樣的

public Object read() { 
+1

'public O read()'與'public Object read()'略有不同:它根據周圍的上下文隱式地轉換返回類型電話。 – Jeffrey

+0

@Jeffrey它可以在理論上,但通常不會,你必須指定類型。 –

0

不知道如果我理解正確的問題......你可以換一個內這兩種方法類和參數化與對象的類型類,如下所示:

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

我會這樣做mak ing全類通用

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是可序列化的類型。如果你想保存(序列化)對象並防止以後的錯誤,這是必需的。

0

我假設調用者讀取()知道它期望得到哪種類型。這是一個合理的假設,因爲他要返回的值賦給一些變量:

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); 
0

是,

public <O> O read() 

是有效的,並會做你想做的(返回任何類型的調用者想要的)。這是否是一個好主意是另一回事