Как вернуть Т в Котлин? - PullRequest
0 голосов
/ 08 марта 2019

Я хочу вернуть T в функцию.

У меня есть интерфейс класса IRepository.kt

interface IRepository
{
    fun <T>Save(model:T)
    fun <T>Delete(model:T)
    fun <T>Get(id:Long):T
}

Я хочу реализовать в Repolmpl.kt

class Repolmpl:IRepository
{

  override fun <T>Delete(model:T)
  {
      println("$model  : Save}")
  }

  override fun <T>Get(id:Long):T
  {
      return T //ERROR here I want to return T...
  }

  override fun <T> Save(model: T) 
  {
      println("$model : Delete")
  }
}

Я видел несколько похожих вопросов в Интернете, но просто не могу найти правильное решение.

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Общий тип T - это в основном просто шаблон.Вы не можете вернуть его, но сначала должны заменить его фактическим типом.Сделайте сам интерфейс универсальным, а не его методы.При реализации укажите T:

interface IRepository<T> {
    fun save(model: T)
    fun delete(model: T)
    fun get(id: Long): T
}

class Repolmpl: IRepository<String>
{
    override fun delete(model: String) {}
    override fun get(id: Long): String {}
    override fun save(model: String) {}
}
0 голосов
/ 08 марта 2019

Вы не можете просто вернуть T.T - это тип здесь, и он похож на return String.

Вы должны вернуть экземпляр T .Итак, что-то вроде:

class Repo {
    val data = mapOf<Long, Any>()

    // ...    

    fun <T> get(id: Long): T {
        return data[id] as T // Get data from somewhere and then cast it to expected type
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...