java - 是否可以在 kotlin 中为多个伴随对象创建一个全局通用函数
问题描述
我在 Kotlin 中开发了一个应用程序,其中包含许多Activities
. 大多数导航只是基本的,开始新的活动,而不是向意图传递任何东西。对于几组活动,我可能会传递标志,这在我的项目中也是重复的(例如 5 个设置的活动intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
)。因此,如果我能找到一种方法来实现这一点,那么事情就会变得更好一些。
为了使事情变得更容易和更整洁,我为具有Activities
以下功能的 对象创建了伴随对象:
class MyActivity: AppCompatActivity() {
companion object {
fun startActivity(context: Context) {
context.startActivity(
Intent(context, MyActivity::class.java)
)
}
}
...
其他类可以简单地调用MyActivity.startActivity(context)
.
该功能非常基本,不同活动中的实现之间的唯一区别显然是MyActivity::class.java
- 部分。所以我想知道是否可以只声明这个函数一次,并以某种方式在多个伴生对象中使用它来进行不同的活动。
现在,我知道我可以做这样的事情:
我定义了一个具有泛型函数的对象,并将其设置如下:
object MyObject {
inline fun <reified T: AppCompatActivity>startActivity(context: Context) {
context.startActivity(
Intent(context, T::class.java)
)
}
}
class MyActivity() : AppCompatActivity() {
companion object {
fun start(context: Context) = MyObject.startActivity<MyActivity>(context)
}
}
但这似乎仍然有点 hacky。我正在寻找的是类似于继承或接口的实现版本,以简单地添加到我的伴随对象中。就像是:
companion object : MyObject<MyActivity>
// Assuming I can somehow put the generic parameter into the object declaration instead of the function or do something similar
或者
companion object {
import MyObject.startActivity<MyActivity>
}
第一个选项特别有用,因为它会自动设置MyObject
for的多个功能MyActivity
。这样的事情甚至可能吗?
解决方案
你甚至不需要伴侣,只需要一个扩展功能。
inline fun <reified T: AppCompatActivity> Activity.startActivity() {
startActivity(Intent(this, T::class.java))
}
如果你需要额外的配置,你可以传递一个 lambda。
inline fun <reified T: AppCompatActivity> Activity.startActivity(intentConfiguration: Intent.() -> Unit) {
startActivity(Intent(this, T::class.java).apply(intentConfiguration))
}