2017-01-05 3 views
1

私はすでにこの問題について多くの答えを見てきましたが、私の人生にとって私はこの問題を私の最後に解決することはできないと私は助けが必要です。未処理のタイプ 'BasePresenter'のメンバーとして 'unchecked' attachView(V) 'の呼び出しを修正する方法はありますか?

BasePresenter:

public abstract class BasePresenter<V> { 

    private V mView; 

    public void attachView(V view) { mView = view; } 
    public void detachView() { mView = null; } 

} 

BaseFragment:

public abstract class BaseFragment<P extends BasePresenter> extends Fragment { 

    @Inject protected P mPresenter; 

    @Override 
    public void onResume() { 
     super.onResume(); 
     mPresenter.attachView(this); // unchecked call to 'attachView(V)' as a member of raw type 'BasePresenter' 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     mPresenter.detachView(); 
    } 

} 

MyPresenter:

public class MyPresenter extends BasePresenter<MyPresenter.MyView> { 

    @Inject 
    public MyPresenter() {} 

    public interface MyView {} 

} 

MyFragment:

public class MyFragment extends BaseFragment implements MyPresenter.MyView {} 
+0

https://hackernoon.com/yet-もう1つのMVP-article-part-1-get-to-know-the-project-d3fd553b3e21を使用して、MVPをよりよく理解してください。 –

答えて

1

シンプル、代わりの

public abstract class BaseFragment<P extends BasePresenter> extends Fragment { 

public abstract class BaseFragment<V, P extends BasePresenter<V>> extends Fragment { 

又は

public abstract class BaseFragment<P extends BasePresenter<BaseFragment<P>>> extends Fragment { 

又は

でなければなりません

基本的に、BasePresenterが何かでパラメータ化されていることを確認してください。




EDIT:

さて、あなたが実際にやろうとしているものに基づいて、あなたはこのようにそれを実行する必要があります。

public abstract class BasePresenter<V> { 

    private V mView; 

    public void attachView(V view) { mView = view; } 
    public void detachView() { mView = null; } 
} 

public abstract class BaseFragment<V extends BaseFragment<V, P>, P extends BasePresenter<V>> extends Fragment { 

    protected abstract P getPresenter(); 

    @Override 
    public void onResume() { 
     super.onResume(); 
     getPresenter().attachView(this); // unchecked call to 'attachView(V)' as a member of raw type 'BasePresenter' 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     getPresenter().detachView(); 
    } 
} 

public class MyPresenter extends BasePresenter<MyPresenter.MyView> { 
    @Inject 
    public MyPresenter() {} 

    public interface MyView {} 
} 

public class MyFragment extends BaseFragment<MyFragment, MyPresenter> implements MyPresenter.MyView { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     MyFragmentComponent component = ((MainActivity)getActivity()).getComponent().myFragmentComponent(); 
     component.inject(this); 
     View view = inflater.inflate(R.layout.blah, container, false); 
     ButterKnife.bind(this, view); 
     return view; 
    } 
} 



EDIT2:提供された例に基づいて:あなたは、このサンプルプロジェクトhttp://github.com/mmirhoseini/marvelを見て、この記事を取ることができ

public class RexTester { 
    // MAIN CLASS 

    static class Rextester { 
     public static void main(String args[]) { 
      new MyFragment(); 
     } 
    } 

// MVP CODE 

    interface BaseView {} 

    final static class MyPresenter extends BasePresenter<MyPresenter.MyView> { 

     public MyPresenter() {} 

     public void executeAction() { 
      mView.onCallback(); 
     } 

     interface MyView extends BaseView { 
      void onCallback(); 
     } 

    } 

    abstract static class BasePresenter<V extends BaseView> { 

     protected V mView; 

     public void attachView(V view) { mView = view;} 
     public void detachView() { mView = null; } 

    } 

    final static class MyFragment extends BaseFragment<MyPresenter.MyView, MyPresenter> implements MyPresenter.MyView { 

     private MyPresenter mPresenter; 

     public MyFragment() { 
      mPresenter = new MyPresenter(); 

      onResume(); // Mock onResume() lifecycle event! 

      mPresenter.executeAction(); 

      onPause(); // Mock onPause() lifecycle event! 
     } 

     protected MyPresenter getPresenter() { 
      return mPresenter; 
     } 

     @Override 
     protected MyPresenter.MyView getThis() { 
      return this; 
     } 

     public void onCallback() { 
      System.out.println("Hello AndroidMVP!"); 
     } 
    } 

    abstract static class BaseFragment<V extends BaseView, P extends BasePresenter<V>> extends Fragment implements BaseView { 

     protected abstract P getPresenter(); 

     protected void onResume() { 
      super.onResume(); 
      getPresenter().attachView(getThis()); 
     } 

     protected abstract V getThis(); 

     protected void onPause() { 
      super.onPause(); 
      getPresenter().detachView(); 
     } 
    } 

// ANDROID FRAMEWORK MOCK 

    abstract static class Fragment { 

     protected void onResume() {} 

     protected void onPause() {} 

    } 
} 
+0

あなたはこのことを明確にしてください。 "フラグメントをビューとして添付しているのであれば、それをビューにするインターフェイスを実装する必要があります。" –

+1

実際には、私はそれをすべて削除し、うまくいくものを追加しました。 – EpicPandaForce

+0

明日はこれを仕事で詳しく見ていきます。ありがとう。 –

3

問題は、型変数の宣言である:あなたがその型パラメータが何であるかを指定する必要がありますので、

class BaseFragment<P extends BasePresenter> 

BasePresenterは、一般的なクラスです。このスニペットから:

mPresenter.attachView(this); 

あなたがBaseFragmentはBasePresenterにおける型の変数Vに拘束されることに期待していると思われる - 次のように私はあなたのBaseFragment宣言を書き換えます:

取るべき
abstract class BaseFragment<P extends BasePresenter<BaseFragment<P>>> { ... } 

チェックされていない警告の注意。 Vは、独立した型変数「ビュー」をモデル化している

abstract class BaseFragment<P extends BasePresenter<V>, V> { ... } 

:それは言った、私は強く、このようなものであるあなたが後に実際にあるものをと思われます。

+0

私はあなたの最初の解決策を働かせることができ、私はそれを理解していますが、複雑すぎるようです。第2のものについては、私はそれを動作させることができませんでした。最初の質問コードに基づいて実際の例を投稿できますか? –

+1

私は、BaseFragment、BasePresenter、Viewの間であなたが望む関係について本当に考える必要があると思います。 BasePragerはBasePresenterに関連付けられますか?それとも、特定のビューを持つBasePresenterでなければならないのですか? –

+0

良い質問です。しかし、私はコメントで答えるのが難しいと思っています...例えば、次のような[例](http://pastebin.com/MLwEczgK)を取ってください。私は基本的に 'attachView(this)'と 'detachView()'ロジックを 'BaseFragment'に移動して、基本フラグメントを拡張する各フラグメントがそれを心配する必要がないようにしたいと思います。 'BaseFragment'が、基本​​プレゼンターを拡張するフラグメントに従って各プレゼンターを表す保護された' presenter'フィールドを公開することも望みます。どのようなエラー/警告なしでこれを達成するための最良の方法は何ですか? –

関連する問題