我有一个Java类函数如下
public void setPositiveButton(int resId, DialogInterface.OnClickListener listener)
Run Code Online (Sandbox Code Playgroud)
我也有如下的Kotlin类功能
fun setPositiveButton(resId: Int, listener: DialogInterface.OnClickListener)
Run Code Online (Sandbox Code Playgroud)
当我从Kotlin代码中调用它们时
javaClassObj.setPositiveButton(R.string.some_string,
DialogInterface.OnClickListener { _, _ -> someFunc()})
kotlinClassObj.setPositiveButton(R.string.some_string,
DialogInterface.OnClickListener { _, _ -> someFunc()})
Run Code Online (Sandbox Code Playgroud)
可以减少Java类函数调用,但不能减少Kotlin类函数
javaClassObj.setPositiveButton(R.string.some_string,
{ _, _ -> someFunc()})
kotlinClassObj.setPositiveButton(R.string.some_string,
DialogInterface.OnClickListener { _, _ -> someFunc()})
Run Code Online (Sandbox Code Playgroud)
为什么Kotlin函数调用不能根据Java启用减少冗余的SAM-Constructor?
我为我的RecyclerView设置了一个ItemClickLister,如下所示:
ItemClickSupport.addTo(recyclerView!!).setOnItemClickListener(
object : ItemClickSupport.OnItemClickListener {
override fun onItemClicked(recyclerView: RecyclerView?, position: Int, v: View?) {
val row = recyclerView!!.getChildAt(position)
val el = row.findViewById(R.id.active_expandablelayout) as ExpandableLayout
if (el.isExpanded) {
el.collapse()
} else {
el.expand()
}
}
}
)
Run Code Online (Sandbox Code Playgroud)
使用我翻译成Kotlin的ItemClickSupport库.
我在object(第2行)上收到错误消息:
object必须声明为abstract或实现抽象成员.
我是Kotlin的新手,我也找不到任何解决方案.
任何帮助是极大的赞赏.
编辑:
这是我的ItemClickSupport.kt:
class ItemClickSupport private constructor(private val mRecyclerView: RecyclerView) {
private var mOnItemClickListener: OnItemClickListener? = null
private var mOnItemLongClickListener: OnItemLongClickListener? = null
private val mOnClickListener = View.OnClickListener { v ->
if (mOnItemClickListener != null) …Run Code Online (Sandbox Code Playgroud) 我正在尝试将一个侦听器从一个动作传递给一个类(一个适配器).
在java中(来自Action的代码):
private void setListeners() {
adapterRecyclerView.setListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
SomeCodehere....
}
});
}
Run Code Online (Sandbox Code Playgroud)
(来自适配器的代码)
public void setListener(View.OnClickListener listener) {
this.listener = listener;
}
Run Code Online (Sandbox Code Playgroud)
有用.
现在我正试图转向kotlin.我首先翻译动作(将动作翻译为kotlin):
private fun setListeners() {
// !! is not fine i know
adapterRecyclerView!!.setListener { v ->
SomeCodehere....
}
}
Run Code Online (Sandbox Code Playgroud)
此时仍然有效.适配器的代码仍然在java和kotlin中的类的代码.现在我将适配器翻译为kotlin:
fun setListener(listener: View.OnClickListener) {
this.listener = listener
}
Run Code Online (Sandbox Code Playgroud)
现在它不起作用.Action没有编译.
错误:无法推断此参数"v"的类型.必需的View.OnClickListener.发现(???)单位.
我该怎么做演员?为什么将参数从kotlin传递给java工作,从kotlin传递给kotlin它不是?
看,我有一个Java类:
public final class JavaReceiveSingle {
public static void useSingle(Single single) {
single.doSth();
}
public static void useSingle2(SingleInterface singleInterface) {
singleInterface.doSth();
}
}
Run Code Online (Sandbox Code Playgroud)
Java接口:
public interface SingleInterface {
void doSth();
}
Run Code Online (Sandbox Code Playgroud)
Kotlin界面:
interface Single {
fun doSth()
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以在类似kotlin的类中使用lambda:
JavaReceiveSingle.useSingle2({})
Run Code Online (Sandbox Code Playgroud)
但是,如果我想对kotlin界面做同样的事情:
JavaReceiveSingle.useSingle({})
Run Code Online (Sandbox Code Playgroud)
IDE将显示错误:必需:单!找到:()->单位
如果我指定Single,例如:
JavaReceiveSingle.useSingle(Single{})
Run Code Online (Sandbox Code Playgroud)
仍然错误:Interface Single没有构造!
尽管以下代码可以工作:
JavaReceiveSingle.useSingle(object :Single{
override fun aa() {}
})
Run Code Online (Sandbox Code Playgroud)
但是为什么我不能将lambda用于kotlin接口呢?