你不能将数组强制转换为List。你的IDE不显示任何错误,因为转换发生在运行时。
相反,你应该使用Arrays.asList(array)
方法,它返回一个包含数组所有元素的列表。
请注意,如果你想要将数组的元素映射到另一个类型,你可以很容易地使用流来完成。例如:
List<MyEnumLanguage> myEnumLanguageList = Arrays.asList(rs.getArray("lang"))
.stream()
.map(arrayElement -> convertToMyEnumLanguage(arrayElement))
.collect(Collectors.toList());
convertToMyEnumLanguage()
函数接受你的数组中的一个元素并返回相应的MyEnumLanguage
枚举。
请查看这篇文章:https://stackify.com/streams-guide-java-8/
更新
一开始我理解错误了问题。在使用Arrays.asList()之前,您必须先将PgArray转换为普通的java数组。
可以使用PgArray.getArray()
方法来完成此操作,然后将返回的对象强制转换为pgArray包含类型的数组。
更新2
示例改进:
首先,您应该像这样定义您的枚举:
public enum MyEnumLanguage {
en_US("en_US"),
de_DE("de_DE");
private final String code;
private MyEnumLanguage(String code) {
this.code = code;
}
public String getCode() {
return code;
}
public static MyEnumLanguage getEnumByCode(String code) {
if(code == null || code.isEmpty()) {
return null;
}
for(MyEnumLanguage e : values()) {
if(e.getCode().equals(code)) {
return e;
}
}
return null;
}
}
然后将您的pgArray映射到List:
Array pgArray = rs.getArray("lang");
String[] langJavaArray = (String[]) pgArray.getArray();
List<MyEnumLanguage> myEnumLanguageList =
Arrays.stream(langJavaArray)
.map(MyEnumLanguage::getEnumByCode)
.collect(Collectors.toList())
;
请注意,映射函数不会检查空值。因此,如果传递错误的代码,则您的列表将包含空值。如果这不是预期结果,则必须在映射函数中执行适当的检查并处理空值情况。