当前位置: 首页 > 知识库问答 >
问题:

无法解析通用方法中枚举的方法值()

郎睿
2023-03-14

我试图构建一个通用方法,它将枚举作为参数并处理一些信息。

但不幸的是,它不能像我希望的那样工作。也许你有一些建议来改进我的代码并防止错误。

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

我在元素上得到以下错误。getValue()元素。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) { 
... 
}

但我的方法不会是通用的。我想对我的任何枚举使用此方法。

共有2个答案

居晗日
2023-03-14

java。lang.Enum没有值()方法,此方法由编译器隐式声明。这意味着values()方法只存在于MyEnum中。类,在MyEnum中找不到。java

有关隐式声明方法和枚举规范的更多信息,请参见https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.9

祁刚毅
2023-03-14

由于您需要所有enum元素来生成RangeOption对象的列表,因此您的方法应该期望作为参数aClass

为了访问枚举常量,可以使用静态方法EnumSet。枚举集的allOf()。它需要enums

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

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

在这种情况下,泛型类型参数必须是

有关泛型方法语法的信息,请参阅本教程

代码可能是这样的:

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

 类似资料:
  • 问题内容: 帮我了解泛型。说我有两个枚举作为内部类,如下所示: 我不想让两个枚举都实现一个接口,而不得不两次实现相同的方法,而是希望在外部类中有一个方法可以执行以下操作: 但是,此方法无法编译。我要尝试做的是找出字符串值是否为枚举值的名称(在任何枚举中),无论是蔬菜,水果,还是其他。不管这实际上是否是冗余方法,我尝试(重新)编写的方法有什么问题? 基本上我想这样做: 问题答案: 原来有几个问题:

  • 问题内容: 因此,我对Java枚举中是否可以包含函数感到困惑。我正在制作一个简单的html编辑器,并希望使用枚举来表示html标签,是的,我知道这不是解决问题的最佳方法,而是我小组决定实现它的方法。 所以我一直在尝试做这样的事情,但是当我试图称其为静态方法时,我想我想知道这是否正确,或者是否有更好的方法来实现它而不是公开成为 问题答案: 是的,Java枚举可以具有功能。 http://docs.o

  • 我对Java中泛型的概念不熟悉。我有一个泛型方法,它的返回类型也是泛型。 我收到此错误,< code >无法解析T中的方法“getAa”。两个类都有这个成员变量,但是java并不理解,因为sub方法返回的是这个对象的一般列表。有没有办法改掉这个错误? 下面是我的代码,

  • 本文向大家介绍Java枚举抽象方法实例解析,包括了Java枚举抽象方法实例解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java枚举抽象方法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需求背景 需求已经确定了几个固定的常量值,并且每个常量值都有相同的行为,但是具体实现细节不同。建议使用枚举抽象方法,优点:结构清晰,便

  • 问题内容: 我有几个使用下划线分隔单词的Java枚举。在我的每个枚举中,我都有一个toString方法,该方法实现为super.toString()。replace(“ _”,“”),这样我就可以在GUI上显示String值而没有下划线。有什么办法可以让我的所有枚举都使用此toString方法,而不必在所有这些枚举之间重复?如果这是一个常规类,答案很简单,实现toString()然后让我所有需要该

  • 多次调用特定枚举类的value()函数是否效率低下? 我见过一些现有代码的实例,其中values()的结果被缓存以供重用。这有用吗?