2012-11-14 134 views
1

的数量如何才能知道,我的枚举有多少价值在这个例子中:泛型类枚举的,价值

public class Analyser<C extends Enum<C>>{ 
    private long[] dist; 
    public Analyser() { 
    super(); 
    dist = new long [C.getEnumConstants().length]; 
    } 
} 

最后一行不起作用。

+0

你得到什么错误? – PearsonArtPhoto

+0

您无法访问泛型类型。这不是一个变量。如果构造函数接受了枚举的引用,则可以找到该长度。 – JustinKSU

+0

@JustinKSU Enum本身被声明为'public abstract class Enum >'。 – assylias

回答

9

您需要在类字面枚举的经过:

public Analyser(Class<C> enumType) { 
    super(); 
    dist = new long [enumType.getEnumConstants().length]; 
} 

... 

Analyser<MyEnum> analyser = new Analyser(MyEnum.class); 

这是因为C有在运行时由于type erasure没有意义。

+1

+1这就是EnumSet或EnumMap使用的习惯用法。 – assylias

+0

这有效。谢谢。如果我只想将任意枚举作为私有字段,我将如何声明该类? – ratatosk

+0

@ratatosk不完全清楚你在问什么。你想声明泛型枚举常量的变量吗?他们只会输入'C'。这里'getEnumConstants()'例如返回一个'C []'。 –

2

我猜最后一行不能编译。你需要Class实例来做到这一点。这里是你的代码的修改版本:

public class Analyser<C extends Enum<C>>{ 
    private long[] dist; 
    public Analyser(Class<C> clazz) { 
    super(); 
    dist = new long [clazz.getEnumConstants().length]; 
    } 
} 

然而,我不能确切地明白你为什么从Enum扩展类。如果你在开发时知道枚举类,你可以只说MyEnum.values().length

如果你想写一个检查多少个值是否有任何枚举你可以只写像一个实用方法的通用代码:

public static int enumSize(Class<C extends Enum<C>> clazz) { 
    return clazz.getEnumConstants().length]; 
    }