我正在编写通用编码器/解码器,并遇到扩展通用的问题。这个主意
我想拥有一个抽象的Encodeable类,该类具有“虚拟”静态方法解码,该方法采用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具有静态方法解码(和非静态方法编码)?

最佳答案

First, static methods in Java cannot be abstract.

其次,如果您希望编译器了解您要返回的是T,而不仅仅是Encodeable,则需要将该方法声明为泛型。我建议完全远离static。基本思路:

public interface Decoder<T> {
    T decode(Byte[] buf);
}

public class FooDecoder implements Decoder<Foo> {
    Foo decode(Byte[] buf){
        // do actual decoding logic here
    }
}

public class Bar<T extends Encodeable> {

    private Decoder<T> decoder; // you'll have to figure out where to get this

    public void messageReceived(MessageEvent e){
        Byte[] buf = e.getMessage();
        T messageObj = decoder.decode(buf);
        // do something with T
    }
}


您最初的设置似乎混合了可编码的类型和知道如何从byte[]解码这些类型的内容,因此我对它进行了重命名和修改。



附带问题:为什么用Byte[]而不是byte[]

09-10 01:57