2016-06-08 30 views
5

Powiedzmy, że mam ten przykładowy kod w Javie:Rozszerzanie klasy rodzajowe w Kotlin

public class MyActivityDelegate implements ActivityMvpDelegate 

gdzie ActivityMvpDelegate:

interface ActivityMvpDelegate<V extends MvpView, P extends MvpPresenter<V>> 

sam kod przekształca się Kotlin wygląda to

class MyActivityDelegate(private val activity: Activity) : ActivityMvpDelegate<MvpView, MvpPresenter<V>> 

Oczywiście otrzymałem nierozwiązane odniesienie pod adresem V i nie jestem pewien, jak powinien wyglądać ten kod, w J Ava nie mam określić generic tutaj .. jakieś wskazówki będę bardzo doceniane

+0

próbka java 'public class MyActivityDelegate realizuje ActivityMvpDelegate' wygląda niekompletne (nie zostanie skompilowany albo), jesteś pewien, że to dokładna deklaracja' MyActivityDelegate'? – miensol

+1

Tak, jest, i tak, kompiluje – henorek

Odpowiedz

4

Twoja deklaracja interfejsu wymaga

  • V rozciąga MvpView
  • V (dokładnie V, a nie jego podtypu) jest używany jako parametr ogólny dla P extends MvpPresenter<V>

Biorąc pod uwagę, że nie można przedłużyć ActivityMvpDelegate<MvpView, MvpPresenter<V>>, ponieważ nie ma gwarancji że V jest dokładnie MvpView (również w Kotlin, parametry ogólne nie są dziedziczone, musisz je ponownie opisać jak class SomeClass<T> : SomeInterface<T>).

Można jednak napisać to jako

class MyActivityDelegate(private val activity: Activity) 
: ActivityMvpDelegate<MvpView, MvpPresenter<MvpView>> 

lub wprowadzenia innego parametru rodzajowego, tak że V i argument dla P są wciąż takie same:

class MyActivityDelegate<T : MvpView>(private val activity: Activity) 
: ActivityMvpDelegate<T, MvpPresenter<T>> 

Można również zmienić ogólna deklaracja twojego interfejsu od P extends MvpPresenter<V> do P extends MvpPresenter<? extends V> (lub użyj out V w Kotlin), a będziesz mógł użyć dowolnego podtypu V jako argumentu, tym ograniczona ogólna:

class MyActivityDelegate<T : MvpView>(private val activity: Activity) 
: ActivityMvpDelegate<MvpView, MvpPresenter<T>> 
Powiązane problemy