我想能夠枚舉映射到「替代值」,因爲在我們的遺留數據庫中,一些枚舉使用的值不能映射到枚舉(即,不是開始當int爲0時,在String類型時不能表示爲枚舉名)。枚舉和泛型「界面預期」與多個邊界
下工作正常,以便能夠枚舉映射到的替代名稱:
public class EnumAlternativeNameHelper {
private static <T extends Enum<T> & EnumAlternativeName> T safeGetByAlternativeName(Class<T> enumClass, String alternativeName) {
for (T t : EnumSet.allOf(enumClass)) {
if (t.getAlternativeName().equals(alternativeName)) {
return t;
}
}
return null;
}
public static <T extends Enum<T> & EnumAlternativeName> Optional<T> getIfPresent(Class<T> enumClass, String alternativeName) {
T t = safeGetByAlternativeName(enumClass,alternativeName);
return Optional.fromNullable(t);
}
public static <T extends Enum<T> & EnumAlternativeName> T valueOf(Class<T> enumClass, String alternativeName) {
T t = safeGetByAlternativeName(enumClass,alternativeName);
return checkNotNull(t,"No alternative name of " + enumClass + " correspond to the provided alternative name = [" + alternativeName+"]");
}
public static <T extends Enum<T> & EnumAlternativeName> Optional<T> valueOfNullSafe(Class<T> enumClass, String alternativeName) {
if (alternativeName == null) {
return Optional.absent();
}
return Optional.of(valueOf(enumClass,alternativeName));
}
}
正如我現在需要處理的備選順序映射,我已經寫了這樣的事情:
public class EnumAlternativeValueHelper<EnumMappingInterface,ValueType> {
private final Function<EnumMappingInterface,ValueType> mappingFunction;
public EnumAlternativeValueHelper(Function<EnumMappingInterface, ValueType> mappingFunction) {
Preconditions.checkArgument(mappingFunction != null);
this.mappingFunction = mappingFunction;
}
private <EnumType extends Enum<EnumType> & EnumMappingInterface> EnumType safeGetByAlternativeValue(Class<EnumType> enumClass, ValueType value) {
for (EnumType enumInstance : EnumSet.allOf(enumClass)) {
if (mappingFunction.apply(enumInstance).equals(value)) {
return enumInstance;
}
}
return null;
}
}
但是泛型聲明<EnumType extends Enum<EnumType> & EnumMappingInterface>
的編譯是因爲EnumMappingInterface:「此處預期的接口」。
我已經看到了這樣的回答: Type parameter with multiple bounds
其實,我EnumMappingInterface是一個泛型類型,這將代表一個接口。它將是EnumAlternativeName或EnumAlternativeOrdinal,它們都定義了一個返回替代值的方法。
有沒有解決方案,以便我可以實現我想要做的?由於
編輯:
EnumMappingInterface是一個通用的類型,因此它不具有任何defition但我認爲這個接口傳遞的泛型類型:
public interface EnumAlternativeName {
String getAlternativeName();
Function<EnumAlternativeName,String> GET_ALTERNATIVE_NAME = new Function<EnumAlternativeName,String>() {
@Override
public String apply(EnumAlternativeName input) {
return input.getAlternativeName();
}
};
}
請問你能展示你的'EnumMappingInterface'的定義嗎? – hoaz
它沒有任何定義,因爲它是通用類型 –