在Kotlin中,是否可以将函数参数限制为2个类类型而不是Any?

时间:2018-10-10 01:20:21

标签: generics inheritance kotlin multiple-inheritance

我正在检查权限,我可以使用Fragment或and Activity来实现。他们没有共同的祖先,所以我让它接受了Any。我想要一种限制它只接受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)) 
                            }
                        })
    }
}

1 个答案:

答案 0 :(得分: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()
            })
}