我正在尝试构建一个泛型方法,它将enum作为参数并处理一些信息。
但不幸的是,这不像我想的那样有效。也许您有一些改进我的代码和防止错误的建议。
private static ProductSearchColumnRange extractAllColumnRangeFromEnum(ProductSearchColumn column,
Enum someEnum) {
return ProductSearchColumnRange.builder()
.column(column)
.range(Arrays.stream(someEnum.values())
.map(element -> new RangeOption(element.getValue(), element.name()))
.collect(Collectors.toList()))
.build();
}我在someEnum.values()调用中得到以下错误:
无法在
Enum中解析方法values()
我在element.getValue()和element.name()调用中得到以下错误:
不能解析方法
getValue()不能解析方法name()
我需要在extractAllColumnRangeFromEnum()方法中使用的枚举都具有相同的结构。
例如,其中一个看起来像这样:
public enum DeploymentModelType {
PRIVATE("Private"),
HYBRID("Hybrid"),
PUBLIC("Public");
String value;
DeploymentModelType(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}我知道我可以通过使用
private static ProductSearchColumnRange extractAllColumnRangeFromEnum(ProductSearchColumn column,
DeploymentModelType someEnum) {
...
}但这样我的方法就不是通用的了。我想把这个方法用于我的任何一个枚举。
发布于 2022-04-11 16:15:17
由于需要所有enum元素来生成RangeOption对象的列表,所以您的方法应该将枚举的Class<T>作为参数,而不是单个元素。
为了访问枚举常量,可以使用EnumSet的静态方法EnumSet。它期望枚举Class<T>作为参数。
为了能够调用自定义方法getValue(),您需要引入一个接口,比如ModelType,它将声明该方法。反过来,DeploymentModelType和其他枚举应该实现这个接口。
并且需要向方法的声明中添加一个泛型参数。它需要放在修饰符之后(如果有的话)和方法的返回类型之前。
在这种情况下,泛型类型参数必须是<T extends Enum<T> & ModelType>。也就是说,T是java.lang.Enum类和ModelType接口的一个子类型。
代码看起来可能是这样的:
private static <T extends Enum<T> & ModelType>
ProductSearchColumnRange
extractAllColumnRangeFromEnum(ProductSearchColumn column,
Class<T> enumClass) {
return ProductSearchColumnRange.builder()
.column(column)
.range(EnumSet.allOf(enumClass).stream()
.map(element -> new RangeOption(element.getValue(), element.name()))
.collect(Collectors.toList()))
.build();
}
public enum DeploymentModelType implements ModelType {
// your code
}
public interface ModelType {
String getValue();
}发布于 2022-04-11 16:25:47
java.lang.Enum没有values()方法,此方法由编译器隐式声明。这意味着values()方法只存在于MyEnum.class中,在MyEnum.java中找不到。
有关隐式声明方法和枚举规范的更多信息可以在https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.9中找到。
https://stackoverflow.com/questions/71830614
复制相似问题