В Kotlin возможно ли ограничить параметр функции двумя типами классов вместо Any? - PullRequest
0 голосов
/ 10 октября 2018

Я проверяю разрешения и могу сделать это с помощью фрагмента или действия.У них нет общего предка, поэтому я заставил его принять любого.Я хотел бы ограничить использование только объектов 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 голосов
/ 10 октября 2018

Невозможно ограничить параметр функции только двумя типами, но вы все равно можете решить проблему дублирования кода с перегрузкой метода.

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()
            })
}
...