2017-12-06 2 views
3

ich hinzufügen neue globale Höhe Level-Schnittstelle:Wie vermeide ich das Gießen?

public interface MvpView { 
    } 

Meine Höhe Level-Schnittstelle:

public interface OfferDetailsView extends MvpView { 

    public void showProgress(); 
} 

Eine weitere Schnittstelle:

public interface OfferDetailsPdfMvp { 

    interface View extends OfferDetailsView { 

     public void openLocalPdfFile(File file, int pageNumber); 

    } 

    interface Presenter extends OfferDetailsPresenter { 

     public void onPageScrolled(int page, int pageCount); 

    } 
} 

Eine weitere Schnittstelle:

public interface OfferDetailsPresenter extends MvpPresenter { 

    public void downloadToAppDir(boolean isDownloadToAppCacheDir); 

    public void onClickScreen(boolean isVisibleTopContainer); 
} 

Eine weitere Schnittstelle:

public interface MvpPresenter<V extends MvpView> { 
    public void attachView(V mvpView); 
} 

Basis abstrakte Klasse:

public abstract class BaseOfferDetailsPresenter<T extends MvpView> implements MvpPresenter<T> { 
    private T view; 

    @Override 
    public void attachView(T mvpView) { 
     this.view = mvpView; 
    } 

    public T getView() { 
     return view; 
    } 
} 

Und conrete Klasse, die von Basisklasse erweitern:

public class OfferDetailsPdfPresenterImpl extends BaseOfferDetailsPresenter<OfferDetailsPdfMvp.View> implements OfferDetailsPdfMvp.Presenter {  

    public void viewIsReady() { 
     getView().showProgress(); //no cast 
     getView().openLocalPdfFile(file, currentPageNumber); // no cast 
    } 

Aber ich kompilieren Fehler:

myproject\app\src\main\java\com\myproject\android\customer\presenter\OfferDetailsPdfPresenterImpl.java:35: error: MvpPresenter cannot be inherited with different arguments: <> and <com.myproject.android.customer.mvp.OfferDetailsPdfMvp.View> 
    public class OfferDetailsPdfPresenterImpl extends BaseOfferDetailsPresenter<OfferDetailsPdfMvp.View> implements OfferDetailsPdfMvp.Presenter { 
+0

[Generika?] (Https://ideone.com/cw7p5E) – Selvin

+0

Ich denke auch über Generika. Aber ich bin neu in Generics. Gibt es gute Beispiele? – Alex

+0

Es ist schwer zu sagen, was vor sich geht - der * neue * Code ist kein [mcve]! Ich sehe zum Beispiel keine Definition für 'getView()' mehr. – GhostCat

Antwort

1

zu machen, was Sie wollen, können Sie Ihre OfferDetailsPresenter Signatur ändern sollte:

public interface OfferDetailsPresenter<T extends MvpView> extends MvpPresenter<T> { 

    void downloadToAppDir(boolean isDownloadToAppCacheDir); 

    void onClickScreen(boolean isVisibleTopContainer); 
} 

Dann innen OfferDetailsPdfMvp sollten Sie Presenter Unterschrift auf die gleiche Weise ändern: View

public interface OfferDetailsPdfMvp { 

    interface View extends OfferDetailsView { 

     public void openLocalPdfFile(File file, int pageNumber); 

    } 

    interface Presenter<T extends MvpView> extends OfferDetailsPresenter<T> { 

     public void onPageScrolled(int page, int pageCount); 

    } 
} 

Und dann gewünschte bevöl wie Sie mit der BaseOfferDetailsPresenter<T extends MvpView> tun:

OfferDetailsPdfPresenterImpl extends BaseOfferDetailsPresenter<OfferDetailsPdfMvp.View> implements OfferDetailsPdfMvp.Presenter<OfferDetailsPdfMvp.View> 
+0

Ich bekomme einen weiteren Fehler: '\ meinProjekt \ app \ src \ main \ Java \ com \ meinProjekt \ android \ customer \ presenter \ OfferDetailsPdfPresenterImpl.java: 36: Fehler: Typ Presenter nehmen keine Parameter public class OfferDetailsPdfPresenterImpl erweitert BaseOfferDetailsPresenter implementiert OfferDetailsPdfMvp.Presenter { ' – Alex

+0

@ user9037997 ich meine Antwort aktualisiert haben. –

+0

Ja, es ist Arbeit. Vielen Dank. – Alex

0

getView() gibt den Typ OfferDetailsView zurück, der keine Methode namens openLocalPdfFile hat.

Vielleicht möchten Sie getView() OfferDetailsPdfMvp.View zurückgeben?

+0

Ich aktualisiere meinen Beitrag – Alex

1

Sie können nicht - mit dieser Signatur.

Denken Sie daran, getView() sagt:

OfferDetailsView getView() 

Also: die Signatur dieser Methode nutzt eine Ihrer Basis-Interfaces.

Es gibt nur zwei Möglichkeiten:

  • Änderung der Rückgabetyp einer spezifischeren Unter Schnittstelle/Klasse
  • eine instanceof Scheck tun + werfen

Gerade vorausgesetzt dass getView() zurückkehrt eine bestimmte Klasse und eine unkontrollierte Besetzung ist nicht gute Praxis. Auf der anderen Seite: Wenn es klar ist, dass getView() eine Instanz von OfferDetailsPdfMvp zurückgibt, dann sollte es keine große Sache sein, die Methodensignatur entsprechend zu ändern.

+0

Ich aktualisiere meinen Beitrag – Alex

Verwandte Themen