android - 如何在内部类中定义常量?
问题描述
我有以下 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
,表示:
此处不允许伴随对象
注意:我知道我可以将其转换为非内部类,但我更愿意保留它。我还检查了我也无法在内部类中定义接口。
解决方案
首先你的Java是无效的。如果你修复它,你会得到一个错误:Inner classes can not have static declarations
内部类中不能有伴生对象,原因与 Java 内部类中不能有成员的原因相同static
https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html:
与实例方法和变量一样,内部类与其封闭类的实例相关联,并且可以直接访问该对象的方法和字段。此外,由于内部类与实例相关联,它本身不能定义任何静态成员。
(由我突出显示)
出于同样的原因,将准静态伴随对象与实例关联是没有意义的。
解决方案(选择一个):
- 使用
val
(类似于final
)。 - 将伴随对象移动到封闭类。
- 不做
HistoryItemHolder
内部类。
推荐阅读
- spring-boot - 获取整个父层次结构
- html - 当您不单击复选框或使用 javascript 时,如何注册单击事件?
- amazon-web-services - AWS Cognito 重定向不匹配
- ios - Swift - 以编程方式从 Storyboard 添加自定义颜色
- c# - 如何将时态表添加到 EF Code-First DBContext?
- elasticsearch - 配置logstash
- sql - Rank 函数总是为每个组返回相同的值?
- html - 使用 Angular Material 将 mat-select 转换为 mat-autocomplete
- python - 相同的 ML 程序正在运行,但此代码给出错误
- angular - fontawesome click 不起作用 click (angular)