gpt4 book ai didi

Scala 的 Java 监听器接口(interface)

转载 作者:行者123 更新时间:2023-11-30 04:28:30 25 4
gpt4 key购买 nike

我有这种带有监听器的 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。我想,我应该使用特质。 [已解决:在本类(class)中,我收到 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);
}
}

在 Activity 中,我不知道如何“实现”该特征。我知道关键字是“with”,但是extends ... with FragmentA.OnArticleSelectedListenerextends ... with OnArticleSelectedListener显示错误 not found: type FragmentAnot found: type OnArticleSelectedListener .

有人知道如何解决这个问题吗?

最佳答案

在 Scala 中,您可以使用 asInstanceOf[Foo] 进行转换。在这种情况下,Scala 编译器认为您引用的是一个名为 OnArticleSelectedListener 的值,但找不到它,因为它不是一个值,而是一个类型。要将 activity 转换为 OnArticleSelectedListener,您可以使用以下代码:

activity.asInstanceOf[OnArticleSelectedListener]

但是,首选方法是使用模式匹配,如here所述。 。如果您采用这种方法,您可以编写:

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) { ... }
}

关于Scala 的 Java 监听器接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15230076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com