【问题标题】:Enum default methods枚举默认方法
【发布时间】:2021-08-24 20:01:37
【问题描述】:

我正在尝试使用带有default 方法的接口为我的一些enums 添加默认方法。该方法应检查enum 是否在enum 值的数组(varargs) 中。

  1. 我收到的第一个警告是"Possible heap pollution from parameterized vararg type",但不是enum,因为它是final,对吧?
  2. 第二个警告是"Unchecked cast: BaseEnum<E> to E"(和"Suspicious call" 警告没有演员表)。在实现接口时传递正确的类型参数之前,它也是安全的。 这是我的示例代码:
public interface BaseEnum<E extends Enum<E>> {

    @SuppressWarnings("unchecked")
    default boolean in(E ... statuses){
        return Arrays.asList(statuses)
                .contains((E) this);
    }
}

public enum Transport implements BaseEnum<Transport> {
    CAR, BUS, PLANE
}

public enum Fruit implements BaseEnum<Fruit> {
    APPLE, CHERRY, LEMON
}

有了这个实现,一切看起来都很安全。但是我怎样才能防止这样的事情呢?(“防止”是指一些代码限制)

public enum Transport implements BaseEnum<Fruit> {
    CAR, BUS, PLANE
}

我查看了新的 Java 15 sealed 功能,但似乎并非如此。有没有更清洁的解决方案?

【问题讨论】:

  • 不可能

标签: java oop types enums interface


【解决方案1】:

无需为此类操作创建接口。 EnumSet 类用于此目的:

Fruit fruit = ...;
boolean match = EnumSet.of(Fruit.APPLE, Fruit.CHERRY).contains(fruit);

【讨论】:

  • 感谢您的回复。但是当我比较这种方法时,第二个看起来更清楚:1)boolean match = EnumSet.of(Fruit.APPLE, Fruit.CHERRY).contains(fruit); 2)boolean match = fruit.in(Fruit.APPLE, Fruit.CHERRY);
  • @AndreiYusupau 我认为您不能使用您的方法使其类型安全。您的接口可能由常规类而不是枚举实现。需要注意的一件事是,您实际上并不需要 contains() 方法中的演员表,您可以直接使用 .contains(this);
  • 如果发生这种情况,如果没有强制转换,这将不是T 类型,它只会默默地返回false,但如果有强制转换,它将是ClassCastException
猜你喜欢
  • 2022-01-24
  • 2020-03-03
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2011-10-27
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多