android - 如何强制方法推断泛型类型
问题描述
在下面的代码中,我有 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")
}
解决方案
我认为问题在于您将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
(就像您已经在做的那样)。
推荐阅读
- python - 使用参数模拟 python 实例方法或调用原始方法
- phpunit - 在 PHPUnit 10 中模拟不存在的类
- python - Selenium:“握手失败……”
- windows - 如何将 UTC 日期时间转换为指定的时区?
- java - 当类实现 Callable 接口时,Spring Env 为 null
- python - Google Cloud - 如何在应用代码中验证用户而不是服务帐户?
- javascript - 如何在名为 HTML 的模板中创建 HTML 模板
- python - 如何向下滚动网页直到要单击的特定按钮?
- javascript - Promise 中非常奇怪的行为 - Uncaught (in promise) - v8 错误?
- ssl - IIS SSL/TLS 如何启用会话恢复