2016-09-18 110 views
0

我有接口无法解析参考方法

interface IIMSIdentifiable { 
    fun setImsId(id : String) 
    fun getImsId() : String 
} 

interface IIMSConsumer : IIMSIdentifiable { 
    fun consumeAsync(message : GRLMessage) 
} 

而且我有一个包含对象与IIMSConsumer

class IMSObject<IIMSConsumer> : Thread { 
    constructor(component : IIMSConsumer) { 
     obj = component 
     // IMSContext.instance.registerObject(this) // hm type mismatch 
    } 

    val objectMessageQueue = LinkedBlockingDeque<GRLMessage>() 
    val obj : IIMSConsumer 
    var isRunning = true 

    override fun run() { 
     while(isRunning) { 
      processMessages() 
     } 
    } 

    fun stopProcessing() { 
     isRunning = false 
    } 

    fun processMessages() { 
     objectMessageQueue.forEach { 
      obj.consumeAsync(it) 
     } 
    } 

    fun getObjectId() : String { 
     return obj.getImsId() 
    } 
} 

一类,但它无法解析引用

fun processMessages() { 
    objectMessageQueue.forEach { 
     obj.consumeAsync(it) // cannot resolve reference !!! 
    } 
} 

fun getObjectId() : String { 
    return obj.getImsId() // cannot resolve reference !!! 
} 

问题是什么?奇怪的是足够多的它并没有对进口尽管位于不同的包问

com.lapots.game.journey.ims.domain.IMSObject 
com.lapots.game.journey.ims.api.IIMSConsumer 

我试着用unresolved reference

interface IConsumer { 
    fun consume() : String 
} 

class Generic<IConsumer>(val consumer : IConsumer) { 
    fun invoke() { 
     print(consumer.consume()) // unresolved reference 
    } 

} 

fun main(args: Array<String>) { 
    val consumer = object : IConsumer { 
     override fun consume() : String { 
      return "I consume" 
     } 
    } 
    val generic = Generic<IConsumer>(consumer) 
    generic.invoke() 
} 

回答

2

class Generic<IConsumer>(val consumer : IConsumer) {

你是测试在简单的东西,并得到了同样的错误用名为IConsumer的通用类型参数创建类Generic。这种类型的参数将跟随你,类中定义的接口,所以你实际上说的是:

class Generic<IConsumer : Any>(val consumer : Any) {

这就是为什么它不能解析的方法,因为泛型参数只能被解释为Any

要修改或更改类型参数以具有适当的名称并绑定(class Generic<T : IConsumer>(val consumer : T) {)或完全删除泛型