gpt4 book ai didi

Java 泛型 : Enums and Interfaces

转载 作者:行者123 更新时间:2023-12-02 09:07:01 24 4
gpt4 key购买 nike

我已经阅读了一些有关此的主题,但仍然不知道如何做我想做的事情:

我有许多扩展特定接口(interface) (HasCode) 的枚举,该接口(interface)声明一个函数 code(),该函数返回该枚举的 int 代码。所有扩展枚举都有私有(private) int 变量和其构造函数的参数(等等)。

我想要一个函数,它接受枚举类作为参数,并返回枚举值的名称和这些枚举值的 int 值的哈希表。

这是我的枚举的示例:

public enum InvoiceStatuses implements HasCode<InvoiceStatuses> {
NONE(0), REQUESTED(10), RECEIVED(20), APPROVED(30), PAID(40), ERROR(-100);
private int code;
private InvoiceStatuses(int a) {
code = a;
}
public int code() {
return code;
}
public static InvoiceStatuses invoiceStatusByCode(int aCode) {
switch (aCode) {
case 0:
return NONE;
case 10:
return REQUESTED;
case 20:
return RECEIVED;
case 30:
return APPROVED;
case 40:
return PAID;
}
return ERROR;
}
public int compare(InvoiceStatuses anotherLevel) {
if (code > anotherLevel.code()) {
return 1;
} else if (code < anotherLevel.code()) {
return -1;
}
return 0;
}
@Override
public InvoiceStatuses[] enumValues() {
return InvoiceStatuses.values();
}
}

HasCode:

public interface HasCode <T extends Enum<?>>{
public int code();
public T[] enumValues();
}

这是具有该神奇函数的类(迭代枚举的值)

import java.util.Hashtable;
import java.util.LinkedList;
public class SelectFromEnum&lt;T extends Enum<?>> {
public SelectFromEnum() {}
public Hashtable<String, String> createSelect(HasCode<T> anEnum) throws Exception{
if (! (anEnum instanceof Enum)) {
throw new Exception ("I only accept enums...");
}
T[] values = anEnum.enumValues();
for (T value : values) {
System.out.println(value.name() + " __ " + ((HasCode)value).code());
}
return null;
}
}

我不喜欢这个的地方:

1) 我必须将一个具体的枚举成员作为参数传递给 createSelect 函数,并且我想传递 (enum).class;

2)我希望 createSelect 的参数指定它是一个扩展给定接口(interface)的枚举,但我不太清楚如何这样做。

更新:

根据 Ingo Kegel 的评论,我按以下方式修改了 SelectFromEnum (见下文),现在 value.name() 无法编译...

import java.util.Hashtable;
import java.util.LinkedList;

public class SelectFromEnum<C extends HasCode> {
public SelectFromEnum() {
}
public Hashtable&lt;String, String> createSelect(Class<C> anEnum) throws Exception {
if (!anEnum.isEnum()) {
throw new Exception("I only accept enums...");
}
C[] values = anEnum.getEnumConstants();
for (C value : values) {
System.out.println(value.name() + " __ " + value.code());
}
return null;
}
}

我可以将 name() 添加到 HasCode 接口(interface),但是有没有办法让编译器相信 value 是一个枚举成员?

最佳答案

您不必使用枚举的实例。您可以传递类并使用 Class#isEnumClass#getEnumConstants()

编辑

您可以将 Class#getEnumConstants() 返回的对象强制转换为 Enum,您的代码应如下所示:

public LinkedList createSelectFrom(Class anEnum) throws Exception {
if (!anEnum.isEnum()) {
throw new Exception("I only accept enums...");
}
Object[] values = anEnum.getEnumConstants();
for (Object value : values) {
System.out.println(((Enum)value).name() + " __ " + ((HasCode) value).code());
}
}

关于Java 泛型 : Enums and Interfaces,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8133908/

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