Kotlin中如何实现Interface的泛型功能?

Ico*_*ast 5 kotlin

shiro 有一个接口 CacheManager.java。

package org.apache.shiro.cache;

public interface CacheManager {
    <K, V> Cache<K, V> getCache(String var1) throws CacheException;
}
Run Code Online (Sandbox Code Playgroud)

我编写了一个类 DefaultCacheManager.kt 来实现 CacheManager。

open class DefaultCacheManager : CacheManager {
    @Throws(CacheException::class)
    override fun getCache(name: String): Cache<Any, Any> {
        return InnerCache(name)
    }
} 
class InnerCache(var name: String) : Cache<Any, Any> {
//.... omitted ....
}
Run Code Online (Sandbox Code Playgroud)

上面的代码会导致编译错误。

Conflicting overloads: 
@Throws public open fun getCache(name: String): Cache<Any, Any> defined in com.yootai.oms.permission.DefaultCacheManager, 
public abstract fun <K : Any!, V : Any!> getCache(p0: String!): Cache<K!, V!>! defined in org.apache.shiro.cache.CacheManager
Run Code Online (Sandbox Code Playgroud)

然后,我修改了下面的代码。

override fun <K : Any?, V : Any?> getCache(name: String): Cache<K, V> {
        return InnerCache(name)
}
Run Code Online (Sandbox Code Playgroud)

但是,它会给我一个编译错误信息。

Type mismatch.
Required: Cache<K,V>
Found: InnerCache
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?请帮我。

Tho*_*mas 2

就目前情况而言,您没有从接口实现该方法:您没有编写返回给定类型的缓存的方法,而是有一个返回该Any类型的缓存的方法。

您还需要使自己的实现变得通用:

open class DefaultCacheManager : CacheManager {
    @Throws(CacheException::class)
    override fun <K, V> getCache(name: String): Cache<K, V> {
        return InnerCache(name)  // creates InnerCache<K, V> thanks to type inference
    }
} 
class InnerCache<K, V>(var name: String) : Cache<K, V> {
//.... omitted ....
}
Run Code Online (Sandbox Code Playgroud)