You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:15:06