AbstractValueAdaptingCache.get checks whether the requested type matches with the value type in the cache. This fails for Kotlin Boolean value type. The usage is as follows:

Cache spec: maximumSize=100,expireAfterWrite=5s

myCache.putIfAbsent(uuid, true) // uuid is a string
myCache.get(uuid, Boolean::class.java)

The type in AbstractValueAdaptingCache.get shows up as boolean, which seems to be the problem, but is correct according to Kotlin docs.

On the JVM, non-nullable values of this type are represented as values of the primitive type boolean.

I'm not aware of a way to use myCache.get with a nullable Boolean type that'd then be translated to Java Boolean wrapper type. Boolean?::class.java isn't valid Kotlin code.

Spring Boot 2.3.4.RELEASE, Spring 5.2.9.RELEASE, Caffeine cache 2.8.6.

Comment From: sbrannen

@sdeleuze, any thoughts on this one?

Comment From: sdeleuze

As you can see here: - kotlin.Boolean is mapped to Java boolean primitive type - kotlin.Boolean? is mapped to java.lang.Boolean

putIfAbsent is defined as public ValueWrapper putIfAbsent(Object key, @Nullable Object value) so when passing true the parameter in there is autoboxing and the type stored is java.lang.Boolean.

Boolean::class.java by default indeed returns the the primitive type but you can use Boolean::class.javaObjectType and your example will work as expected.

Based on that I think it works as expected and that we can close this issue. Please reopen with a more information if you think there is something we should fix.