【问题标题】:In Kotlin, is it possible to limit a function parameter to 2 class types instead of Any?在 Kotlin 中,是否可以将函数参数限制为 2 类类型而不是 Any?
【发布时间】:2019-03-14 20:09:00
【问题描述】:

我正在检查权限,我可以使用 Fragment 或 Activity 来检查。他们没有共同的祖先,所以我让它接受任何。我想要一种方法来限制它只接受 Activity 或 Fragment 对象。有没有办法做一些可以采用 Class1 或 Class2 的泛型?

    fun requestLocationPermission(fragmentOrActivity: Any) {
    if (fragmentOrActivity is Fragment) {
        RxPermissions(fragmentOrActivity)
                .request(android.Manifest.permission.ACCESS_FINE_LOCATION)
                .subscribeBy(
                        onNext = { granted ->
                            if (!granted) {
                                fragmentOrActivity.toast(fragmentOrActivity.getString(location_message_locationPermissionRequired)) 
                            }
                        })
    } else if (fragmentOrActivity is FragmentActivity) {
        RxPermissions(fragmentOrActivity)
                .request(android.Manifest.permission.ACCESS_FINE_LOCATION)
                .subscribeBy(
                        onNext = { granted ->
                            if (!granted) {
                                fragmentOrActivity.toast(fragmentOrActivity.getString(location_message_locationPermissionRequired)) 
                            }
                        })
    }
}

【问题讨论】:

  • 为什么不重载函数并让一个版本接受 Activity 而另一个版本接受 Fragment?
  • 您需要一个Interface,您的FragmentFragmentActivity 都将实施。然后你可以在你的函数参数中使用 Interface 类型。
  • @Egor 不能解决代码重复问题。

标签: generics inheritance kotlin multiple-inheritance


【解决方案1】:

无法将函数参数限制为两种类型,但您仍然可以通过方法重载解决代码重复问题。

fun requestLocationPermission(fragment: Fragment) {
    requestLocationPermission(RxPermissions(fragment), fragment.getActivity())
}

fun requestLocationPermission(activity: FragmentActivity) {
    requestLocationPermission(RxPermissions(activity), activity)
}

private fun requestLocationPermission(rx: RxPermissions, context: Context) {
    rx.request(android.Manifest.permission.ACCESS_FINE_LOCATION)
            .subscribeBy(onNext = { granted -> 
                if (!granted) Toast.make(context, 
                        location_message_locationPermissionRequired, 
                        Toast.LENGTH_SHORT).show()
            })
}

【讨论】:

    猜你喜欢
    • 2021-03-06
    • 2023-03-13
    • 1970-01-01
    • 2021-12-15
    • 2011-11-12
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多