Почему конструктор Intent невидим в сопутствующем объекте? Котлин

class MainActivity : AppCompatActivity() { companion object { fun makeIntent(pos : Int) { println("${pos} is here!") var intent = Intent(this, DetailActivity::class.java) if (intent != null) { println("intent is not null in makeIntent function") } else { println("intent is null in makeIntent function") } } } ... } 

Выполняя var intent = Intent(...) он не видит Intent. Зачем?

Intent конструктора Intent Context передается как аргумент. Внутри makeIntent this ссылка на экземпляр объекта-компаньона . Сопутствующий объект не имеет ссылки на экземпляр содержащего класс. Следовательно, вам нужно будет каким-то образом передать Context :

 class MainActivity : AppCompatActivity() { companion object { fun makeIntent(pos : Int, context:Context):Intent { println("${pos} is here!") var intent = Intent(context, DetailActivity::class.java) return intent } } 

В дополнение к превосходному ответу @ meinsol, вы можете сохранить свой код примерно одинаково, если добавить к функции makeIntent приемник:

 class MainActivity : AppCompatActivity() { companion object { fun Context.makeIntent(pos : Int) { // <- Notice the Context receiver here println("${pos} is here!") var intent = Intent(this, DetailActivity::class.java) // Do what you want with the intent } } ... } 

Затем вы можете вызывать его из любого места, где вы находитесь в контексте ( makeIntent(5) ), или если вы не в контексте, но имеете один доступный, используйте его ( context.makeIntent(5) )