1

私はリスナーを備えたこの種のJavaソースコードを持っています。

public static class FragmentA extends ListFragment {
    OnArticleSelectedListener mListener;
    ...
    // Container Activity must implement this interface
    public interface OnArticleSelectedListener {
        public void onArticleSelected(int position);
    }
    ...
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnArticleSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(
                "Activity must implement OnArticleSelectedListener");
        }
    }
    ...
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Send the event to the host activity
        mListener.onArticleSelected(position);
    }
}

そして、私はそれをこのように実装します:

public class MyActivity implements FragmentA.OnArticleSelectedListener {
    ...
    @Override
    public void onArticleSelected(int pos) {
        // do something
    }
}

それで、今はそれをScalaに変換したいと思います。私は、特性を使用する必要があると思います。[解決済み:このクラスでは、エラーが発生しますonAttach] not found: value OnArticleSelectedListener

class FragmentA extends ListFragment {
    var mListener: OnArticleSelectedListener = null
    ...
    trait OnArticleSelectedListener {
        def onArticleSelected(position: Int)
    }
    ...
    override def onAttach(activity: Activity) {
        super.onAttach(activity)
        mListener = (OnArticleSelectedListener) activity;
    }
    ...
    override def onListItemClick(l: ListView, v: View, position: Int, id: Long) {
        // Send the event to the host activity
        mListener.onArticleSelected(position);
    }
}

アクティビティでは、トレイトを「実装」する方法がわかりません。キーワードが「with」であることは知っていますが、エラーまたは。がextends ... with FragmentA.OnArticleSelectedListener表示extends ... with OnArticleSelectedListenerされnot found: type FragmentAますnot found: type OnArticleSelectedListener

この問題を解決する方法を考えている人はいますか?

4

1 に答える 1

2

Scalaでは、を使用してキャストできますasInstanceOf[Foo]。この場合、Scalaコンパイラーは、呼び出された値を参照していると見なしますが、値OnArticleSelectedListenerではなく型であるため、それを見つけることができません。にキャストactivityするには、次のOnArticleSelectedListenerコードを使用できます。

activity.asInstanceOf[OnArticleSelectedListener]

ただし、推奨されるアプローチは、ここで説明するパターンマッチングを使用することです。このアプローチを取る場合は、次のように書くことができます。

mListener = activity match {
    case myActivity: OnArticleSelectedListener => activity
    case _ => throw new ClassCastException 
}

asInstanceOfセマンティクスはまったく同じであり、より簡潔であるため、この場合はに固執します。

OnArticleSelectedListenerクラスの外に定義を移動すると、次のFragmentAように拡張できるはずです。

 trait OnArticleSelectedListener { def onArticleSelected(position: Int) }
 class MyActivity extends OnArticleSelectedListener {
   def onArticleSelected(position: Int) { ... }
 }
于 2013-03-05T17:30:53.833 に答える