枚举的通用输入参数编译错误
Generic Input Parameter Compilation Error With Enum
我有一个 Java 枚举 Class,如下所示。我正在尝试将 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) {
}
}
}
你能帮我理解背后的原因吗?因为在 return 中也使用了相同的通用参数 R,并且在第一种方法中被成功编译。但是当它作为输入参数传递时,它会失败。
这个签名:
public abstract <M extends IADataType, R extends IBDataType> IConverter<M, R> getInstance1(R data);
意味着该方法的实现必须采用 any R(在范围内)。
您正在尝试实施它以采用特定的 R。
那根本行不通,因为它不是覆盖等效的。
此外,您应该非常小心这些 @SuppressWarnings("unchecked")
注释。仅抑制您可以推理的警告实际上是安全的;这些都不是。
如果您希望枚举值具有不同的类型,则不能使用枚举。最终,枚举值只是包含 class.
中的静态最终字段
所以,只要定义一个class,就可以使用class级的类型变量来约束特定的类型。
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);
}
我有一个 Java 枚举 Class,如下所示。我正在尝试将 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) {
}
}
}
你能帮我理解背后的原因吗?因为在 return 中也使用了相同的通用参数 R,并且在第一种方法中被成功编译。但是当它作为输入参数传递时,它会失败。
这个签名:
public abstract <M extends IADataType, R extends IBDataType> IConverter<M, R> getInstance1(R data);
意味着该方法的实现必须采用 any R(在范围内)。
您正在尝试实施它以采用特定的 R。
那根本行不通,因为它不是覆盖等效的。
此外,您应该非常小心这些 @SuppressWarnings("unchecked")
注释。仅抑制您可以推理的警告实际上是安全的;这些都不是。
如果您希望枚举值具有不同的类型,则不能使用枚举。最终,枚举值只是包含 class.
中的静态最终字段所以,只要定义一个class,就可以使用class级的类型变量来约束特定的类型。
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);
}