首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法解析泛型方法中Enum的方法‘`values()’

无法解析泛型方法中Enum的方法‘`values()’
EN

Stack Overflow用户
提问于 2022-04-11 15:40:31
回答 2查看 393关注 0票数 2

我正在尝试构建一个泛型方法,它将enum作为参数并处理一些信息。

但不幸的是,这不像我想的那样有效。也许您有一些改进我的代码和防止错误的建议。

代码语言:javascript
复制
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()方法中使用的枚举都具有相同的结构。

例如,其中一个看起来像这样:

代码语言:javascript
复制
public enum DeploymentModelType {
   PRIVATE("Private"),
   HYBRID("Hybrid"),
   PUBLIC("Public");

   String value;

   DeploymentModelType(String value) {
       this.value = value;
   }

   public String getValue() {
       return value;
   }
}

我知道我可以通过使用

代码语言:javascript
复制
private static ProductSearchColumnRange extractAllColumnRangeFromEnum(ProductSearchColumn column,
                                                                      DeploymentModelType someEnum) { 
... 
}

但这样我的方法就不是通用的了。我想把这个方法用于我的任何一个枚举。

EN

回答 2

Stack Overflow用户

发布于 2022-04-11 16:15:17

由于需要所有enum元素来生成RangeOption对象的列表,所以您的方法应该将枚举的Class<T>作为参数,而不是单个元素。

为了访问枚举常量,可以使用EnumSet的静态方法EnumSet。它期望枚举Class<T>作为参数。

为了能够调用自定义方法getValue(),您需要引入一个接口,比如ModelType,它将声明该方法。反过来,DeploymentModelType和其他枚举应该实现这个接口。

并且需要向方法的声明中添加一个泛型参数。它需要放在修饰符之后(如果有的话)和方法的返回类型之前。

在这种情况下,泛型类型参数必须是<T extends Enum<T> & ModelType>。也就是说,Tjava.lang.Enum类和ModelType接口的一个子类型。

代码看起来可能是这样的:

代码语言:javascript
复制
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();
}
票数 4
EN

Stack Overflow用户

发布于 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中找到。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71830614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档