У меня есть интерфейсы
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() }
class Generic<IConsumer>(val consumer : IConsumer) {
Вы создаете класс Generic
с IConsumer
параметром типа IConsumer
. Этот параметр будет затенять интерфейс, который вы определили в этом классе, поэтому вы на самом деле говорите:
class Generic<IConsumer : Any>(val consumer : Any) {
Вот почему он не может разрешить метод, поскольку общий параметр может быть интерпретирован только как Any
.
Чтобы исправить либо изменить параметр типа, чтобы иметь соответствующие имена и class Generic<T : IConsumer>(val consumer : T) {
( class Generic<T : IConsumer>(val consumer : T) {
), либо полностью удалить генерики