![](/img/trans.png)
[英]Compilation error while overriding abstract enum method with generic return type
[英]Generic Input Parameter Compilation Error With Enum
我有一个Java枚举类,如下所示。 我正在尝试将A类型布尔值转换为B类型。 为此,我将Generic与Factory一起使用。 但是这里getInstance()
方法实现的代码已成功编译,而getInstance1()
方法实现失败。
public enum FactoryEnum {
BOOLEAN {
@SuppressWarnings("unchecked")
@Override
public IConverter<ABoolean, BBoolean> getInstance() {// Compiled Successfully
return new BooleanConverter();
}
@SuppressWarnings("unchecked")
@Override
public IConverter<ABoolean, BBoolean> getInstance(BBoolean bacStacDataType) { // Compilation Failed
return new BooleanConverter(bacStacDataType);
}
};
public abstract <M extends IADataType, R extends IBDataType> IConverter<M, R> getInstance();
public abstract <M extends IADataType, R extends IBDataType> IConverter<M, R> getInstance1(R data);
// A Type
public interface IADataType {
}
public class ABoolean implements IADataType {
}
// B Type
public interface IBDataType {
}
public class BBoolean implements IBDataType {
}
//Converter to Convert Data From A to B
public interface IConverter<M, R> {
}
public class BooleanConverter implements IConverter<ABoolean, BBoolean> {
public BooleanConverter() {
}
public BooleanConverter(BBoolean boolean1) {
}
}
}
您能帮我了解其背后的原因吗? 因为在第一个方法中也成功地使用了相同的通用参数R,所以在此方法中编译成功。 但是,当将其作为输入参数传递时,它将失败。
此签名:
public abstract <M extends IADataType, R extends IBDataType> IConverter<M, R> getInstance1(R data);
表示该方法的实现必须采用任何 R(在范围内)。
您正在尝试将其实现为采用特定的R。
那根本行不通,因为它不是等效的。
另外,您应该非常警惕这些@SuppressWarnings("unchecked")
批注。 仅抑制您可以推理的警告实际上是安全的; 这些不是。
如果希望枚举值具有不同的类型,则不能使用枚举。 最终,枚举值只是包含类中的静态final字段。
因此,只需定义一个类,然后就可以使用类级别的类型变量来约束特定的类型。
public class FactoryClass<M extends IADataType, R extends IBDataType> {
public static final FactoryClass<ABoolean, BBoolean> BOOLEAN = new FactoryClass<ABoolean, BBoolean>() {
@Override
public BooleanConverter getInstance() {
return new BooleanConverter();
}
@Override
public BooleanConverter getInstance(BBoolean bacStacDataType) {
return new BooleanConverter(bacStacDataType);
}
};
public abstract IConverter<M, R> getInstance();
public abstract IConverter<M, R> getInstance1(R data);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.