首页 > 解决方案 > 如何强制方法推断泛型类型

问题描述

在下面的代码中,我有 2 个片段 FragmentLeft 和 FragmentRight 都从 Fragment 类扩展。根据下面的扩展方法,我正在尝试使用通用数据类型作为方法的参数,因此当我使用此方法时,它应该接受 FragmentLeft 或 FragmentRight 的实例.....

但是,下面的代码会生成注释中所述的错误

请让我知道如何解决它

代码

var fragTransactionInstance = getFragmentManagerInstance()?.let {
        it.getFragmentTransactionInstance()
            ?.replaceTransaction(R.id.fragLeft, fragmentLeft)//no enough 
   information to infer type variable T   
            ?.replaceTransaction(R.id.fragRight, fragmentRight)////no 
   enough information to infer type variable T 
    }?.also {
        it.commit()
    }
  }

fun initViews() : Unit {
    fragmentLeft = FragmentLeft()
    fragmentRight = FragmentRight()
}
fun <T : Fragment> FragmentTransaction.replaceTransaction(layout: Int, t: 
Fragment?): FragmentTransaction {
    return this.replace(layout, t)
}

import android.os.Bundle
import android.support.v4.app.Fragment
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.example.kotlindynmaicfragment_v1.MainActivity
import com.example.kotlindynmaicfragment_v1.R
import kotlinx.android.synthetic.main.activity_main.view.*

class FragmentRight : Fragment() {

val LOG_TAG = this::class.java.name

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    Log.d(LOG_TAG, "onCreate")

}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    Log.d(LOG_TAG, "onActivityCreated")

}

///////////////////
class FragmentLeft : Fragment() {

val LOG_TAG = this::class.java.name

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    Log.d(LOG_TAG, "onCreate")

}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    Log.d(LOG_TAG, "onActivityCreated")

}

标签: androidandroid-fragmentsgenericskotlin

解决方案


我认为问题在于您将replaceTransaction方法定义为泛型,但您根本没有T在该方法中使用,因此类型推断不知道使用什么类型代替T.

给你一个更简单的例子,这将导致同样的错误:

fun <T> foo() {
    println("Hello, world!")
}

fun main() {
    foo()
}

发生这种情况是因为T无法推断,因此您需要明确说明要使用的类型(即使在 中根本没有使用它foo):

fun main() {
    foo<Unit>() // I used Unit, but any other type would do
}

鉴于此,T您的代码中是否需要?两者都FragmentRight扩展FragmentLeftFragment,因此除非您需要使用这些类中的特定功能,否则您可以丢弃T并使用父类型Fragment(就像您已经在做的那样)。


推荐阅读