Java Enum Generic的使用值方法

时间:2019-02-07 13:18:48

标签: java generics enums

我想用一个枚举对一个类进行参数化,然后在该类的构造函数中创建一个具有枚举中元素数量大小的Array。

我创建了这样的课程:

public class LogLine <T extends Enum<T>> {

然后在构造函数中,我尝试编写以下代码:

public LogLine(){
numberOfElementsInEnum = T.values().length;
//then I would create the Array based on the numberOfElementsInEnum variable

它不起作用。编译器看不到values方法。 我尝试用T扩展String而不是Enum。然后可以访问所有静态方法。 这是什么问题?

2 个答案:

答案 0 :(得分:5)

您必须声明一个接受Class的构造函数:

public LogLine(Class<T> c) {
    numberOfElementsInEnum = c.getEnumConstants().length;
}

另请参见:https://docs.oracle.com/javase/tutorial/reflect/special/enumMembers.html

答案 1 :(得分:2)

您并非严格"have to" pass the class to the constructor。在某些情况下,这对于实例化您的班级的人来说是不必要的麻烦。

这完全取决于您的界面。

如果您的界面纯粹是项的使用者(并且考虑到您正在记录日志,那么我怀疑是这样),那么您就可以在实际使用时懒惰地计算值的数量,从而摆脱困境。项目。

class LogLine<T extends Enum<T>>
{
    public void add(T item)
    {
        int numberOfElementsInEnum = item.getDeclaringClass().getEnumConstants().length;
    }
}

我们需要了解您的要求并查看LogLine的其余实施情况,以说明这种方法是否合适。