RedisTemplate `execute` 类型不匹配

问题描述 投票:0回答:2
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    private RedisTemplate defaultRedisTemplate;



RedisScript<Boolean> redisScript = new DefaultRedisScript(Test, Boolean.class);

  // this line is OK, stringRedisTemplate.execute returns boolean
  boolean result1 = stringRedisTemplate.execute(redisScript, Arrays.asList(key), value);
  
  // line blow indicates type mismatch, defaultRedisTemplate.execute returns Object
  boolean result2 = defaultRedisTemplate.execute(redisScript, Arrays.asList(key), value);

为什么

defaultRedisTemplate.execute
的返回类型是Object而不是boolean?

spring redis spring-data-redis
2个回答
0
投票
public interface RedisOperations<K,V> {
    public <T> T execute(RedisScript<T> script, List<K> keys, Object... args)
}

public class StringRedisTemplate extends RedisTemplate<String,String> {}

从原始类型类调用泛型方法时,这是预期的编译时行为。

另一方面

StringRedisTemplate
是伪类型,因为它的超类类型参数
RedisTemplate
如上所述。

这就是字符串redis模板变体编译成功的原因。

如果您要传递通用变体,代码将可以正常编译。

@Resource
private RedisTemplate<String, Object> defaultRedisTemplate;

0
投票
new DefaultRedisScript<>(luaScript, Boolean.class)

试试这个,添加'<>'

© www.soinside.com 2019 - 2024. All rights reserved.