我有以下Java代码想要转换为Kotlin:
class RideHistoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
class HistoryItemHolder extends RecyclerView.ViewHolder {
private static final int TYPE_IN_PROGRESS = 1
private static final int TYPE_CANCELLED = 2
private static final int TYPE_FINISHED = 3
// class methods and properties are written
}
}
我想出了以下代码:
class RideHistoryAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private inner class HistoryItemHolder(view: View)
: RecyclerView.ViewHolder(view) {
private companion object {
private const val TYPE_IN_PROGRESS = 1
private const val TYPE_CANCELLED = 2
private const val TYPE_FINISHED = 3
// class methods and properties are written
}
}
}
Android Studio在行companion object
的“对象”下方呈红色波浪状显示,
此处不允许使用随播对象
注意::我知道我可以将其转换为非内部类,但我希望保留它。我还检查了我也无法在内部类中定义接口。
答案 0 :(得分:5)
首先,您的Java无效。如果您对其进行修复,则会收到错误消息:Inner classes can not have static declarations
由于无法拥有static
members in an inner class in java
https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html:
与实例方法和变量一样,内部类也被关联 包含其封闭类的实例,并可以直接访问该类 对象的方法和字段。 此外,因为内部类是 与实例相关联,它本身无法定义任何静态成员。
(我的重点)
基于相同的推理,将准静态伴侣对象与实例相关联是没有意义的。
解决方案(选择一项):
val
(类似于final
)。HistoryItemHolder
不是内部类。答案 1 :(得分:0)
我可以确认无法在内部类中添加常量(请参阅Kotlin论坛上的my question)。
但是,有两种方法可以解决(我选择了第一种):
使ViewHolder
为非内部类-这意味着它不再可以访问适配器的方法/属性:
public class Adapter {
public class ViewHolder(private val adapter: Adapter) {
private companion object {
private const val TYPE_IN_PROGRESS = 1
private const val TYPE_CANCELLED = 2
private const val TYPE_FINISHED = 3
}
}
}
在适配器中定义常量:
public class Adapter {
private const val TYPE_IN_PROGRESS = 1
private const val TYPE_CANCELLED = 2
private const val TYPE_FINISHED = 3
public class ViewHolder(private val adapter: Adapter) {
// ..
}
}
注意:请勿将您的const val
转换为val
,因为它将绑定到您的类实例(这很糟糕。More about it here)。