在我的缓存类中,我将有一个函数将对象的序列化版本(未定义类型)写入文件,类似这样(泛型函数):
public <O> void write(O object) {
// ...
serialize(file, object);
// ...
}
哪个很好用,但是,我无法找到一种方法来创建一个可以返回任何对象的方法,就像write()
方法可以接受任何对象一样。寻找这样的东西:
public <O> read() {
// ...
O object = unserialize(file);
// ...
return object;
}
有关如何实现这一目标的任何建议都非常感谢!
答案 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()
是有效的,可以做你想做的事情(返回调用者想要的任何类型)。这是否是一个好主意是另一回事