2016-06-08 26 views
5

Diciamo che ho questo codice di esempio in Java:Estendere classe generica in Kotlin

public class MyActivityDelegate implements ActivityMvpDelegate 

dove ActivityMvpDelegate:

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

Stesso codice convertito in Kotlin assomiglia a questo

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

Ovviamente ho trovato riferimento irrisolto allo V e non sono sicuro di come dovrebbe apparire questo codice, in J ava Non ho specificare generico su qui .. qualche consiglio andando molto apprezzato

+0

tuo campione java 'public class MyActivityDelegate implementa ActivityMvpDelegate' sembra incompleta (non si compila o), sei sicuro che sia la dichiarazione esatta del' MyActivityDelegate'? – miensol

+1

Sì, lo è, e sì, lo compila – henorek

risposta

4

tua dichiarazione di interfaccia richiede che

  • V estende MvpView
  • V (esattamente V, non il suo sottotipo) è utilizzato come parametro generico per P extends MvpPresenter<V>

Dato che, non è possibile estendere ActivityMvpDelegate<MvpView, MvpPresenter<V>>, perché non c'è alcuna garanzia che V è esattamente MvpView (inoltre, in Kotlin, i parametri generici non sono ereditati implicitamente, devi ridirigerli come class SomeClass<T> : SomeInterface<T>).

È possibile, tuttavia, scrivere come

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

o introdurre un altro parametro generico, in modo che V e l'argomento per P sono sempre gli stessi:

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

È inoltre possibile cambiare il dichiarazione generica dell'interfaccia da P extends MvpPresenter<V> a P extends MvpPresenter<? extends V> (o utilizzare out V in Kotlin) e sarà possibile utilizzare qualsiasi sottotipo di V come argomento, compresi delimitata generico:

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