2013-03-05 6 views
1

나는 이런 종류의 자바 소스 코드를 Listener와 함께 가지고있다.스칼라에 대한 Java Listener 인터페이스

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 
    } 
} 

그래서, 지금은 스칼라로 변환 할 수 있습니다. 나는 특성을 사용해야한다고 생각합니다. [이 해결 :이 클래스에서 그 not found: value OnArticleSelectedListeneronAttach에 오류] : 활동에서

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); 
    } 
} 

, 나는 특성을 "실행"하는 방법을 모르겠어요. 키워드가 "함께"있지만, extends ... with FragmentA.OnArticleSelectedListenerextends ... with OnArticleSelectedListenernot found: type FragmentA 또는 not found: type OnArticleSelectedListener이라는 오류를 표시합니다.

누구나이 문제를 해결하는 방법은?

답변

2

스칼라에서 asInstanceOf[Foo]을 사용하여 전송할 수 있습니다. 이 경우, Scala 컴파일러는 OnArticleSelectedListener이라는 값을 참조하지만 값이 아니기 때문에 값을 찾을 수 없다고 생각합니다.

activity.asInstanceOf[OnArticleSelectedListener] 

그러나, 선호하는 방법은 설명 here으로 패턴 매칭을 사용하는 것입니다 OnArticleSelectedListeneractivity 캐스트하려면이 코드를 사용할 수 있습니다. 이 방법을 가지고가는 경우에, 당신은 쓸 수 : 의미가 정확히 동일하고 더 간결 때문에

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

나는,이 경우 asInstanceOf 스틱 것입니다.

당신이 FragmentA 클래스의 OnArticleSelectedListener 외부의 정의를 이동하는 경우, 당신은 이런 식으로 확장 할 수 있어야한다 :``의 경우 myActivity : OnArticleSelectedListener => myActivity`` 그렇지 않으면

trait OnArticleSelectedListener { def onArticleSelected(position: Int) } 
class MyActivity extends OnArticleSelectedListener { 
    def onArticleSelected(position: Int) { ... } 
} 
+0

내가 써야했다 오류가 발생합니다 :''형식 불일치; 발견 : android.app.Activity required : FragmentA.this.OnArticleSelectedListener'' – Tim

+0

잘못된 '활동'을 가져 왔을 수 있습니다. – yakshaver

+0

네, 처음에는''MyActivity''를 끝내야 만했지만,이 특성을 올바르게 구현하고 처리하는 방법을 모르겠습니다. Java에서는''FragmentA.OnArticleSelectedListener'를 구현하고 메소드를 재정의 할 수 있습니다. 스칼라에서? – Tim