【问题标题】:Kotlin generic bounds for Class类的 Kotlin 通用边界
【发布时间】:2015-01-29 15:37:31
【问题描述】:

以下泛型无法编译。这里有什么语义错误?

函数调用

start(MainActivity.javaClass) // <== Doesn't compile

方法定义

// Definition
public fun <T : Activity> start(activityClass: Class<T>) {
    startActivity(Intent(this, activityClass))
}

编译器错误

Error:(43, 9) Type parameter bound for T in fun <T : android.app.Activity> 
start(activityClass: java.lang.Class<T>): kotlin.Unit is not satisfied:  
inferred type com.mobsandgeeks.hellokotlin.MainActivity.
<class-object-for-MainActivity> is not a subtype of android.app.Activity

【问题讨论】:

    标签: generics kotlin


    【解决方案1】:

    javaClass 已被弃用。改用这个:

    val i = Intent(this@Activity, Activity::class.java)
    startActivity(i)
    

    【讨论】:

      【解决方案2】:

      使用javaClass&lt;MainActivity&gt;() 而不是MainActivity.javaClass

      【讨论】:

      • 谢谢,成功了。如果要传入 MainActivity.javaClass 应该使用什么遗传类型参数?
      • 如果你的意思是类似于 Java 的 MainActivity.class,那么在 Kotlin 中使用 javaClass&lt;MainActivity&gt;()
      • 安德烈,没错。我的意思是问,如何更改上述代码编译的函数签名?
      • 您可以从T 中删除绑定的: Activity,但是您将MainActivity 的类对象传递给Intent,因此它必须是能够处理此意图的组件。
      • 澄清:一个类和它的类对象不通过继承或任何其他类型的关系相关。类对象与类关联只是为了方便,所以我认为将类对象传递给start() 是没有意义的
      【解决方案3】:

      另一种选择:

      inline public fun <reified T : Activity> start() {
          startActivity(Intent(this, javaClass<T>()))
      }
      start<MainActivity>()
      

      【讨论】:

      • 我更喜欢这个,我将使用这个 +1。然而,安德烈的回答与我的问题更相关。
      • 是的,没错。这个答案只是一个“更好”的选择
      • 或者你可以使用intentFor&lt;MyActivity&gt;(),如果你使用的是anko,基本上是一样的
      • 此语法在当前 Kotlin 中已更改,您能否将答案使用 javaClass&lt;T&gt; 更新为 T::class.java
      【解决方案4】:

      它对我有用的唯一方法是这样做:

      val intent = Intent(this, NextActivity::class.java)
      startActivity(intent)
      

      其他解决方案均无效,包括使用javaClass

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多