如何在SpEL中调用接口静态方法?调用IntStream.of报错咨询
当然可以在SpEL里调用接口的静态方法啦!不过你遇到的报错是参数类型不匹配导致的,咱们来一步步解决这个问题:
问题根源
你的表达式 T(java.util.stream.IntStream).of(new Integer[]{1,2,3}).sum() 之所以报错,核心原因是参数类型不兼容:IntStream.of() 提供的重载方法只接受 int...(可变参数,本质是 int[])或者 IntStream 类型的参数,但你传入的是 Integer[] 数组。SpEL没办法自动把 Integer[] 转换成 int[],所以找不到匹配的方法,才会抛出「Problem locating method of on type class java.lang.Class」的错误。
两种可行的修正方案
方案一:直接传入int类型的可变参数
如果不需要用Integer数组,直接传int值就可以了,SpEL会自动识别为int...参数,表达式就能正常执行:
T(java.util.stream.IntStream).of(1,2,3).sum()
方案二:把Integer[]转换成int[]再传入
如果你必须基于Integer数组来处理,可以借助Arrays.stream()先把Integer数组转成int流,再调用sum方法:
T(java.util.Arrays).stream(new Integer[]{1,2,3}).mapToInt(T(java.lang.Integer)::intValue).sum()
或者更简洁的写法(利用自动拆箱):
T(java.util.Arrays).stream(new Integer[]{1,2,3}).mapToInt(i -> i).sum()
小提示
在SpEL里调用接口静态方法的语法是完全合法的,只要注意这几点:
- 必须用
T()包裹类/接口的全限定名 - 方法参数类型要完全匹配(SpEL的自动类型转换能力有限,尤其是基本类型包装类数组和基本类型数组之间不会自动转换)
- 调用的方法必须是public的静态方法
内容的提问来源于stack exchange,提问作者Lior
相关产品推荐
相关产品推荐

