@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?
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;
new DefaultRedisScript<>(luaScript, Boolean.class)
试试这个,添加'<>'