我有下面的类层次结构,它们仅实现了对给定字节数组中的动物进行编码和解码的想象功能。
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];
}
}
这表示您正在尝试更清晰地建模的对象-
AnimalTransformer
为Animal
的某些子类提供了转换方法,这取决于子类或匿名实现来阐明。