我想用一个枚举对一个类进行参数化,然后在该类的构造函数中创建一个具有枚举中元素数量大小的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。然后可以访问所有静态方法。 这是什么问题?
答案 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
的其余实施情况,以说明这种方法是否合适。