使用枚举参数化方法的返回类型 - 可能吗?

时间:2011-05-03 19:23:18

标签: java generics

在java中,我知道有可能例如:

static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
    for (T o : a) {
        c.add(o); // Correct
    }
}

在我的场景中,我有一个可以检索值的不同设置的枚举,其中每个设置都有不同的值类型。我想在枚举中指定这些值类型,并获得类似于上面的编译时检查。

这是一个带运行时检查的版本 - 可以进行编译时检查吗?

public class Foo {
  public static enum ClientSetting {
    SOME_STRING_SETTING(String.class),
    SOME_INTEGER_SETTING(Integer.class);

    private Class valueClass;

    ClientSetting(Class valueClass) {
      this.valueClass = valueClass;
    }
  }

  public static <T> T get(ClientSetting bar) {
    if (bar.valueClass.equals(String.class))
      return (T) "My string value.";
    else if (bar.valueClass.equals(Integer.class))
      return (T) new Integer(2);
    else
      return null; // unreachable if every possibility is  checked
  }

  public static void main(String[] args) {
    String stringValue = get(ClientSetting.SOME_STRING_SETTING);
    Integer integerValue = get(ClientSetting.SOME_INTEGER_SETTING);
  }
}

谢谢!

2 个答案:

答案 0 :(得分:4)

dacc,这件事对你有用吗?

public static class ClientSetting<T> {
   private T setting;

   ClientSetting(T setting) {
      this.setting = setting;
   }

   public T get() {
      return setting;
   }
}

// Old school, I know.
public static final ClientSetting<String> SOME_STRING_SETTING = 
   new ClientSetting<String>("My string value.");
public static final ClientSetting<Integer> SOME_INTEGER_SETTING = 
   new ClientSetting<Integer>(2);

public static <T> T get(ClientSetting<T> clientSetting) {
   // delegation, this method is not really needed
   // you can go for SOME_STRING_SETTING.get()
   return clientSetting.get();
}

public static void main(String[] args) {
   String stringValue = get(SOME_STRING_SETTING);
   Integer integerValue = get(SOME_INTEGER_SETTING);
   // Won't compile
   // String wrong = get(SOME_INTEGER_SETTING);
}

答案 1 :(得分:0)

我不确定这是否会有所帮助,但是如果你在ClientSetting上放置一个泛型怎么办?您可以传递ClientSetting<String>ClientSetting<Integer>。假设您正在编写特定的其中一个,将进行一些编译时检查。

相关问题