有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是否可能使用枚举参数化方法的返回类型?

在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) 个答案

  1. # 1 楼答案

    我不确定这是否会有帮助,但如果你在客户端设置一个通用的呢?你可以传递ClientSetting<String>ClientSetting<Integer>。假设您是针对其中一个特定的代码编写的,则会进行一些编译时检查

  2. # 2 楼答案

    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);
    }