在下面的代码中,我有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")
}
答案 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
}
鉴于此,您的代码中是否完全需要T
? FragmentRight
和FragmentLeft
都从Fragment
扩展,因此除非您需要使用这些类中的特定功能,否则可以丢弃T
并使用父类型Fragment
(因为您已经在做)。
答案 1 :(得分:0)
将go run main.go
的类型更改为t:Fragment
,而不是t
,而不是使用T
尝试以这种方式编写扩展功能:
Fragment