2016-06-08 12 views
5

Lassen Sie uns sagen, dass ich diesen Beispielcode in Java haben:Erweiterung generische Klasse in Kotlin

public class MyActivityDelegate implements ActivityMvpDelegate 

wo ActivityMvpDelegate:

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

Same Code Kotlin wie diese

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

umgewandelt sieht

Natürlich habe ich bei V ungelösten Bezug und ich bin mir nicht sicher, wie dieser Code aussehen sollte, in J ava Ich muss hier generisch nicht angeben .. irgendwelche Tipps Gonna viel

geschätzt werden
+0

Java-Probe 'public class MyActivityDelegate implementiert ActivityMvpDelegate' unvollständig aussieht (es wird nicht kompiliert entweder), sind Sie sicher, das ist die genaue Erklärung von' MyActivityDelegate'? – miensol

+1

Ja ist es, und ja, es kompiliert – henorek

Antwort

4

Ihre Schnittstelle Erklärung verlangt, dass

  • VMvpView
  • V (genau V, nicht seine Subtyp) erstreckt, als generischer Parameter für P extends MvpPresenter<V> verwendet

da können Sie ActivityMvpDelegate<MvpView, MvpPresenter<V>> nicht verlängern, da es keine Garantie gibt dass V ist genau MvpView (auch in Kotlin, generische Parameter sind nicht implizit vererbt, müssen Sie sie wie class SomeClass<T> : SomeInterface<T> deklarieren).

Sie können jedoch, schreiben Sie es als

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

oder eine andere generische Parameter einführen, so dass V und das Argument für P immer noch die gleichen sind:

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

Sie auch die ändern Generische Deklaration Ihrer Schnittstelle von P extends MvpPresenter<V> bis P extends MvpPresenter<? extends V> (oder verwenden Sie out V in Kotlin), und Sie können jeden Subtyp von V als Argument verwenden, begrenzt, einschließlich allgemeiner:

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