gpt4 book ai didi

java - 如何实现类型参数为 Enum 和其他类型的通用接口(interface)

转载 作者:行者123 更新时间:2023-12-01 18:45:32 24 4
gpt4 key购买 nike

我正在使用一个接受类型参数的接口(interface):

public interface Container<T>

现在我可以有一个类来实现它:

public class EnumContainer implements Container<Enum>

但现在假设我想要一个用于枚举的Container,它实现了一个名为Position的接口(interface):

public interface Position {
String getAbbreviation();
String getDescription();
}

如何定义PositionEnumContainer?我已经尝试过,但这是一个编译时错误:

public class PositionEnumContainer implements Container<Enum & Position>

我不想使 PositionEnumContainer 通用,例如:

public class PositionEnumContainer <T extends Enum<T> & Position> implements Container<T>

最佳答案

您可以制作PositionEnumContainer实现Container<Enum<? extends Position>> .

如果一个类扩展 Enum<? extends Position>那么它是 enum class它还实现了 Position ,因此,PositionEnumContainer只接受 Enum 类型的对象类型为Position 。但不幸的是,Java 不知道这一点,所以PositionEnumContainer的生成方法将返回 Enum<? extends Position> ,不能隐式转换回 Position ,你必须自己转换它或使用安全 Enums#narrow方法。

public class Enums {
@SuppressWarnings("unchecked") // only class E can extend Enum<E>
public static <E extends Enum<E>> E narrow(Enum<E> obj) {
return (E) obj;
}
}
<小时/>

或者,您可以创建 PositionEnum接口(interface) extends Positioncan only be implemented by enums然后使 PositionEnumContainer实现Container<PositionEnum> 。在这种情况下,每个 ConcretePositionEnum将必须实现PositionEnum<ConcretePositionEnum>而不是Position .

// should only be implemented by enums
// you can verify it with annotation processor
public interface IEnum<E extends Enum<E>> extends Comparable<E> {
String name();
int ordinal();
Class<E> getDeclaringClass();

@SuppressWarnings("unchecked")
default E self() { return (E) this; }
}

public interface PositionEnum<E extends Enum<E> & Position> extends IEnum<E>, Position {}

关于java - 如何实现类型参数为 Enum 和其他类型的通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59849833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com