为了账号安全,请及时绑定邮箱和手机立即绑定

枚举的通用输入参数编译错误

枚举的通用输入参数编译错误

慕运维8079593 2023-06-04 16:56:37
我有一个 Java 枚举类,如下所示。我正在尝试将 A 类型布尔值转换为 B 类型。为此,我将工厂与通用一起使用。但是这里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 返回,它被成功编译。但是当它作为输入参数传递时,它失败了。
查看完整描述

1 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

这个签名:

public abstract <M extends IADataType, R extends IBDataType> IConverter<M, R> getInstance1(R data);

意味着该方法的实现必须采用任何R(在范围内)。

您正在尝试实现它以采用特定的 R。

那根本行不通,因为它不是覆盖等效的。

此外,您应该非常小心这些@SuppressWarnings("unchecked")注释。仅抑制您可以推理的警告实际上是安全的;这些不是。


如果您希望枚举值具有不同的类型,则不能使用枚举。最终,枚举值只是包含类中的静态最终字段。

因此,只需定义一个类,然后您就可以使用类级类型变量来约束特定类型。

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);

}


查看完整回答
反对 回复 2023-06-04
  • 1 回答
  • 0 关注
  • 140 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信