2017-08-10 51 views
1

shiro有一个接口CacheManager.java。如何在Kotlin中实现Interface的通用功能?

package org.apache.shiro.cache; 

public interface CacheManager { 
    <K, V> Cache<K, V> getCache(String var1) throws CacheException; 
} 

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

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 .... 
} 

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

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 

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

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

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

Type mismatch. 
Required: Cache<K,V> 
Found: InnerCache 

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

回答

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 .... 
} 
+0

这对我的作品。 谢谢你的回答 – Iconoclast

相关问题