在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);
}
}
谢谢!
答案 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>
。假设您正在编写特定的其中一个,将进行一些编译时检查。