我正在编写通用编码器/解码器并遇到扩展通用的问题。这个想法是我想要一个抽象的 Encodeable 类,它有一个“虚拟”静态方法 decode,它接受一个 Byte[] 并构造对象,类似于 Serializable。(我知道这在 java 中不能真正做到。)扩展 Encodeable 的每个类都将覆盖编码/解码方法。然后我想通用地使用这些 Encodeable 子类。这是试图说明我的意思:
public class Encodeable{
// I'd like to write
// static abstract Encodeable decode(Byte[]);
// similar to
// virtual Encodeable decode(Byte[]) = 0;
// in C++, but that seems to be illegal in java
static Encodeable decode(Byte[] buf){return null};
}
public class EncodeableFoo extends Encodeable{
static EncodeableFoo decode(Byte[] buf){
// do actual decoding logic here
}
}
public class Bar<T extends Encodeable>{
public void messageReceived(MessageEvent e){
Byte[] buf = e.getMessage();
T messageObj = T.decode(buf);
// do something with T
}
}
照原样,我收到一条错误消息,例如
error: incompatible types
T messageObj = T.decode(objBuf);
^
required: T
found: Encodeable
where T is a type-variable:
T extends Encodeable declared in class EdgeClientHandler
在编译时。但是如果我将解码线更改为
T messageObj = (T) T.decode(objBuf);
它工作得很好。有人可以向我解释这个黑魔法吗?或者,更重要的是,给我一个更好的方法来编写我的通用 Bar 类,这样它就知道 T 有一个静态方法解码(和一个非静态方法编码)?