2017-08-10 3 views
1

Es gibt eine Schnittstelle CacheManager.java von Shiro.Wie generische Funktion der Schnittstelle in Kotlin zu implementieren?

package org.apache.shiro.cache; 

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

Ich schrieb eine Klasse DefaultCacheManager.kt, die den CacheManager implementiert.

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

Der obige Code würde Kompilierungsfehler verursachen.

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 

Dann habe ich meinen Code unten geändert.

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

Aber es würde mir eine Kompilierungsfehlerinfo geben.

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

Wie kann ich das Problem beheben? Bitte hilf mir.

Antwort

2

Wie es aussieht, sind Sie der Umsetzung nicht die Methode von der Schnittstelle: Sie keine Methode geschrieben haben, der einen Cache für die Typen gegeben zurück, sondern haben Sie eine Methode, die einen Cache für die Any zurück Art.

Sie müssen Ihre eigenen Implementierungen Generika sowie machen:

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

Es funktioniert für mich. Vielen Dank für Ihre Antwort – Iconoclast

Verwandte Themen