2012-02-02 42 views
1

我有我试图使用泛型转换功能,所以到目前为止,我有:转换此功能使用泛型

public static <T extends Enum<T> & SomeInterface> EnumSet<T> convertToES(long val) { 
    EnumSet<T> es = EnumSet.noneOf(T.class); 

    for(T t : values()) { 
     if(t.getSomeProperty() > 0) 
     es.add(t); 
    } 


    return es; 
} 

凡SomeInterface有一个单一的财产getSomeProperty。

T.class不工作,并且values()似乎也不起作用。

以前我有:

public static EnumSet<SomeType> convertToES(long val) { 
     EnumSet<SomeType> es = EnumSet.noneOf(SomeType.class); 

     for (SomeType p : values()) { 
      if (p.getSomeThing())) > 0) { 
       es.add(p); 
      } 
     } 

     return es; 
    } 

有没有一种方法,使这项工作,或者是不可能的?

回答

3

这是因为Java通过擦除实现了泛型所以T在运行时不存在。 Java中的泛型只是一种语言工具,可帮助您避免在编译时发生太多错误。

的解决办法是要求主叫人的方法给你的类本身作为一个真正的说法:

public static <T extends Enum<T> & SomeInterface> EnumSet<T> convertToES(
    long val, 
    Class<T> tClass) 
{ 
    EnumSet<T> es = EnumSet.noneOf(tClass); 

至于values()而言,该方法存在的枚举类本身,因此,如果你感动的代码从这个类,你需要获取值的另一种方式:

for(T t : tClass.getEnumConstants()) { 
     .... 
+1

您将需要通过类作为参数传递给你的方法。 (否则,'EnumSet.noneOf'本身不需要'Class'参数!) – 2012-02-02 03:24:37

0

T.class不工作,因为T是不是一类。 你可能需要反思。我建议沿线的一些东西:

public static <T extends Enum<T> & SomeInterface> EnumSet<T> convertToES(Class<T> clazz, long val) { 

    EnumSet<T> es = EnumSet.noneOf(clazz); 

    for(T t : clazz.getEnumConstants()) { 
     if(t.getSomeProperty() > 0) 
      es.add(t); 
    } 
    return es; 
    } 
0

该方法不知道你想要哪个枚举 - 它不知道。我建议刚好路过它:

public static <T extends Enum<T> & SomeInterface> // 
     EnumSet<T> convertToES(Class<T> tClass, long val) { 
    EnumSet<T> set = EnumSet.noneOf(tClass); 
    for (T t : EnumSet.allOf(tClass)) { 
     if (t.getSomeProperty() == val) { 
      set.add(t); 
     } 
    } 
    return set; 
} 

调用它像这样:

EnumSet<Foo> x = convertToES(Foo.class, 3); 

甚至

for(Foo suitableFoo: convertToES(Foo.class, 5)) { 
    print(suitableFoo + " has a property of 5!"); 
}