如何强制方法推断通用类型

时间:2019-07-08 14:01:15

标签: android android-fragments generics kotlin

在下面的代码中,我有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")

}

2 个答案:

答案 0 :(得分:1)

我认为问题出在以下事实:您将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
}

鉴于此,您的代码中是否完全需要TFragmentRightFragmentLeft都从Fragment扩展,因此除非您需要使用这些类中的特定功能,否则可以丢弃T并使用父类型Fragment (因为您已经在做)。

答案 1 :(得分:0)

go run main.go的类型更改为t:Fragment,而不是t,而不是使用T 尝试以这种方式编写扩展功能:

Fragment
相关问题