我有下面的类层次结构,它们仅实现了对给定字节数组中的动物进行编码和解码的想象功能。

public abstract class Animal {
}

class Tiger extends Animal{
    private String name;

    public void setName() {
    }

    public String getName() {
        return this.name;
    }
}

abstract class AnimalTransformer {
    public static <T> T decodeAnimalFromBytes(byte[] animalInBytes) {
        return null;
    }

    public static byte[] encodeAnimalInBytes(Animal animal) {
        return null;
    }


}

class TigerTransformer extends AnimalTransformer{
    public static Tiger decodeAnimalFromBytes(byte[] animalInBytes) {
        return new Tiger();
    }

    public static byte[] encodeAnimalinBytes(Tiger tiger) {
        return new byte[0];
    }
}


在扩展了AnimalTransformer的TigerTransformer类的AnimalTransformer抽象类的重写方法上,我得到以下警告

Type safety: The return type Tiger for decodeAnimalFromBytes(byte[]) from the type
TigerTransformer needs unchecked conversion to conform to T
from the type AnimalTransformer


我了解此警告的原因,但不幸的是,由于我是泛型新手,因此无法解决该警告。有人可以简要说明如何纠正此警告吗?

最佳答案

首先,不要试图用静态方法“覆盖”。它不能像您想象的那样工作-仍然可以通过子类(偶然)从子类访问“覆盖”的静态方法。如果要覆盖行为,请使用本地方法。

之所以生成警告,是因为Tiger方法签名与超类方法承诺的内容不兼容-客户端选择的任何类<T>都可以解码为该类,这是一个很大的,无法实现的承诺。

更好的方法是:

abstract class AnimalTransformer<T extends Animal> {
  public T decodeAnimalFromBytes(byte[] animalInBytes) {
    return null;
  }
  public static byte[] encodeAnimalInBytes(T animal) {
    return null;
  }
}

class TigerTransformer extends AnimalTransformer<Tiger> {
  public Tiger decodeAnimalFromBytes(byte[] animalInBytes) {
    return new Tiger();
  }
  public byte[] encodeAnimalinBytes(Tiger tiger) {
      return new byte[0];
  }
}


这表示您正在尝试更清晰地建模的对象-AnimalTransformerAnimal的某些子类提供了转换方法,这取决于子类或匿名实现来阐明。

10-02 16:05