gpt4 book ai didi

java - 在 Java 中实现通用接口(interface)的枚举常量

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:10:26 26 4
gpt4 key购买 nike

假设您有一个通用接口(interface):

public interface MyInterface<T> {
T doSomething();
}

是否可以声明一个实现 MyInterface<T> 的枚举? , 但每个枚举常量都为不同的值 T 实现它?也就是说,给定这个枚举:

public enum MyEnum {
FOO,
BAR,
BAZ;
}

我们可以改变它吗FOO工具 MyInterface<Integer> , BAR工具 MyInterface<String> , 和 BAZ工具 MyInterface<List<MyOtherType>> , 并使 MyEnum整体工具MyInterface<?> ?这样做似乎是完全可行的,所以它可能以类型安全的方式完成。

最佳答案

不,因为amalloy pointed out , Java 不允许使用类型参数声明枚举。很明显为什么如果你考虑枚举的使用方式,例如在 switch 中.

还要考虑该语言将如何实现通用枚举 - 这并非微不足道。对于通用枚举 MyEnum<T> ,每个枚举常量都需要解析 T某些特定类型,否则它们根本就不是常量。考虑一下:

enum MyEnum<T> {
FOO; // T is not resolved
}

什么是 T对于 FOO这里?该语言需要一种新的语法才能表达它,例如:

enum MyEnum<T> {
FOO<String>;
}

因此,现在我们正在增加语言的复杂性,以支持没有过于引人注目的用例的语义。很容易理解为什么语言设计者会简单地禁止枚举的类型参数。

解决方法:

您可以通过简单地不使用枚举来模拟您想要的模式。将接口(interface)的实现组织到实用程序类中:

public class MyImplementations {

public static final MyInterface<Integer> FOO =
new MyInterface<Integer>() {
...
};

public static final MyInterface<String> BAR =
new MyInterface<String>() {
...
};

public static final MyInterface<List<MyOtherType>> BAZ =
new MyInterface<List<MyOtherType>>() {
...
};

private MyImplementations() { }
}

唯一固有缺失的是迭代不同实现的方法,正如您可以使用 MyEnum.values() 完成的那样- 但假设有一个 MyEnum<T> ,您可以迭代的最具体的类型是 MyEnum<?> .

关于java - 在 Java 中实现通用接口(interface)的枚举常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13207016/

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