实现泛型类型接口

问题描述 投票:1回答:3

假设我有以下接口:

public interface MvpView { }

public interface MvpPresenter<V extends MvpView> {
    void attach(V view);
}

然后是一个实现MvpPresenter的基类

public class BasePresenter<V extends MvpView> implements MvpPresenter<V> {
    private V view;

    @Override
    public void attach(V view) {
        this.view = view;
    }
}

最后是扩展BasePresenter的以下类

public abstract class BaseFragment<P extends MvpPresenter> implements MvpView {
    P presenter;

    public void someMethod() {
        presenter.attach(this);
    }
}

虽然这编译它并不安全,因为无法保证类的实现将实现正确的MvpViewP presenter使用的那个)。为了安全起见,我遗漏了someMethod的代码,每个实现都必须填写完全相同的代码presenter.attach(this)

我想做什么,但我不知道如何如下:

public abstract class BaseFragment<V extends MvpView, P extends MvpPresenter<V>> implements V {
    P presenter;

    public void someMethod() {
        presenter.attach(this);
    }
}

有没有办法实现这个目标?

java generics interface
3个回答
3
投票

像这样宣布BaseFragment

abstract class BaseFragment<P extends MvpPresenter<R>, R extends BaseFragment<P,R>> implements MvpView {
    P presenter;

   public void someMethod() {
        presenter.attach(getThis());
   }

   abstract R getThis();
   }
}

并使用这样的扩展,

class MyFragment extends BaseFragment<MvpPresenter<MyFragment>, MyFragment> {

    @Override
    MyFragment getThis() {
        return this;
    }   

}

1
投票

这编译:

public abstract class BaseFragment<P extends MvpPresenter<BaseFragment>> implements MvpView {

    P presenter;

    public void someMethod() {
        presenter.attach(this);
    }
}

但我还没有找到一种实际的子类化方法。我不确定MvpView是否真的需要任何东西。也许这样的事情会有用:

public interface MvpPresenter<V> {

    void attach(V view);
}

public class BasePresenter<V> implements MvpPresenter<V> {
    private V view;

    @Override
    public void attach(V view) {
        this.view = view;
    }
}

public abstract class BaseFragment<R extends BaseFragment>  {

    MvpPresenter<R> presenter;

    public void someMethod() {
        presenter.attach(getThis());
    }

    abstract R getThis();
}

public class MyBaseFragment extends BaseFragment<MyBaseFragment> {

    @Override
    MyBaseFragment getThis() {
        return this;
    }

}

0
投票

根据boobalan gnanasekaran和user158037的答案,我这样做了:

public interface MvpView { }

public interface MvpPresenter<V extends MvpView> {
    void attach(V view);
}

public class BasePresenter<V extends MvpView> implements MvpPresenter<V> {
    private V view;

    @Override
    public void attach(V view) {
        this.view = view;
    }

    public V getView() {
        return view;
    }
}

public abstract class BaseFragment<V extends MvpView, P extends MvpPresenter<V>> {
    P presenter;

    protected abstract V getThis();

    public void someMethod() {
        presenter.attach(getThis());
    }

    public P getPresenter() { return presenter; }
}

并举例说明

public interface MoviesContract {
    interface Presenter extends MvpPresenter<MoviesContract.View> {
        void loadMovies();
    }

    interface View extends MvpView {
        void onMoviesLoaded();
    }
}

public class MoviesPresenter extends BasePresenter<MoviesContract.View>
    implements MoviesContract.Presenter {

    @Override
    public void loadMovies() {
        getView.onMoviesLoaded();
    }
}


public class MoviesFragment extends BaseFragment<MoviesContract.View, MoviesContract.Presenter>
    implements MoviesContract.View {

    @Override
    public MoviesContract.View getThis() {
        return this;
    }

    public loadMovies() {
        getPresenter().loadMovies();
    }

    @Override
    public void onMoviesLoaded() {
        //
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.