JavaFX调用findUniqueSubstring方法遇ClassCastException求助
问题:查找唯一子串时触发ClassCastException
问题详情
在JavaFX应用中,调用方法从集合中查找目标字符串的唯一标识子串时,在noneMatch执行行抛出如下异常:
java.lang.ClassCastException: class org.eclipse.parsson.JsonStringImpl cannot be cast to class java.lang.String
核心方法代码
负责查找唯一子串的findUniqueSubstring实现:
/** * 从集合的所有字符串中找出能唯一标识目标字符串的子串。 * * @param value 目标字符串 * @param collection 其他字符串的集合 * @return 目标字符串的唯一子串,若不存在则返回原字符串 */ public static String findUniqueSubstring(final String value, final Collection<String> collection) { return IntStream.range(1, value.length() + 1) .mapToObj(len -> IntStream.range(0, value.length() - len + 1) .mapToObj(begin -> value.substring(begin, begin + len)) .filter(substring -> collection.parallelStream() .noneMatch(other -> other.contains(substring))) .findFirst()) .filter(Optional::isPresent).map(Optional::get).findFirst() .orElse(value); }
问题根源定位
集合中的部分元素由以下方法填充,该方法直接将JsonArray.toArray()返回的JsonStringImpl实例强转为泛型<T>(实际业务期望是String),导致集合中存储的并非String对象:
public static <T> ObservableList<T> array(final JsonObject jo, final String key) { final List<Object> list = Arrays .asList(jo.getJsonArray(key).toArray()); final List<T> result = new ArrayList<>(); list.forEach(item -> result.add((T) item)); return FXCollections.observableList(result); }
修复方案
修改array方法,将JsonString类型的元素转换为实际的String值,从根源解决类型不匹配问题:
方案一:遍历处理
public static <T> ObservableList<T> array(final JsonObject jo, final String key) { final JsonArray jsonArray = jo.getJsonArray(key); final List<T> result = new ArrayList<>(); for (JsonValue value : jsonArray) { if (value instanceof JsonString jsonStr) { // 提取JsonString封装的实际字符串值 result.add((T) jsonStr.getString()); } else { // 非字符串类型可转为字符串或根据业务需求处理 result.add((T) value.toString()); } } return FXCollections.observableList(result); }
方案二:流式处理
import java.util.stream.Collectors; public static <T> ObservableList<T> array(final JsonObject jo, final String key) { List<T> list = jo.getJsonArray(key) .stream() .map(value -> { if (value instanceof JsonString jsonStr) { return (T) jsonStr.getString(); } return (T) value.toString(); }) .collect(Collectors.toList()); return FXCollections.observableList(list); }
说明
从根源修复array方法是最优选择,可避免后续其他使用该集合的代码再出现类似类型转换异常。若仅做临时处理,也可在调用findUniqueSubstring前将集合元素批量转换为String,但这种方式治标不治本,不推荐使用。
内容的提问来源于stack exchange,提问作者Rodrigo Oliveira Perez
相关产品推荐
相关产品推荐

