2017-08-10 77 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