首页 > 解决方案 > 如何在内部类中定义常量?

问题描述

我有以下 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,表示:

此处不允许伴随对象

注意:我知道我可以将其转换为非内部类,但我更愿意保留它。我还检查了我也无法在内部类中定义接口。

标签: androidkotlin

解决方案


首先你的Java是无效的。如果你修复它,你会得到一个错误:Inner classes can not have static declarations

无效的java

内部类中不能有伴生对象,原因与 Java 内部类中不能有成员的原因相同static

https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

与实例方法和变量一样,内部类与其封闭类的实例相关联,并且可以直接访问该对象的方法和字段。此外,由于内部类与实例相关联,它本身不能定义任何静态成员。

(由我突出显示)

出于同样的原因,将准静态伴随对象与实例关联是没有意义的。

解决方案(选择一个):

  1. 使用val(类似于final)。
  2. 将伴随对象移动到封闭类。
  3. 不做HistoryItemHolder内部类。

推荐阅读