В Kotlin (как и в Java) перечисления определяются во время компиляции как одиночные. Вот почему вы не можете использовать переменные на них. Только предопределенные статические значения.
У вас есть это перечисление
enum class MyEnum(val text: String) {
MyValue("some text")
}
И вы называете его
val myEnum = MyEnum.MyValue
Каждый раз, когда у вас будет один и тот же объект.
Все перечисления, которые объявлены внутри других классов, являются static (здесь * это вопрос по stackoverflow о статическом ключевом слове), что означает, что они не зависят от объектов во время выполнения, но отклассы во время компиляции.
data class MyClass {
enum class MyEnum {
...
}
}
Будет компилироваться в:
public class MyClass {
public static enum MyEnum {
...
}
}
Вот почему вы не можете использовать inner модификатор для них:

Для достижения желаемого результата у вас есть два варианта:
1) Использовать свойства:
interface Constants {
val text: String
}
// data classes are final and cannot be extended later
data class ViewState(val viewName: String) : Constants {
override val text = "some view text"
}
data class LayerState(val layerName: String) : Constants {
override val text = "some layer text"
}
2) Определитьдва разных перечисления (без интерфейса):
data class ViewState(val viewName: String) {
enum class StringProperties(val string: String) {
Text("some view text")
}
}
data class LayerState(val layerName: String) {
enum class StringProperties(val string: String) {
Text("some layer text")
}
}
Таким образом, вы можете использовать его "как есть", но без вашего Constants
интерфейса
val viewText = ViewState.StringProperties.Text.string // "some view text"
val layerText = LayerState.StringProperties.Text.string // "some layer text"
Редактировать:
Kotlin поддерживает extensions , но не меняет ваш класс. Вместо этого создается новый метод с вашим объектом в качестве аргумента:
fun MyObject.extensionFunc() {
// do stuff
}
Скомпилируется в
public void extensionFunc(MyObject $receiver) {
// do stuff
}
Редактировать 2:
Я наткнулся наВаш вопрос снова, продумал его снова, и я думаю, что у меня есть решение для вас: как Adapter
и ViewHolder
связаны в RecyclerView
android lib.
interface Adapter<T : Adapter.ViewHolder> {
fun doSmth(viewHolder: T)
interface ViewHolder
}
Всякий раз, когда вы хотитереализовать Adapter
вы также должны реализовать ViewHolder
:
class AdapterImpl : Adapter<AdapterImpl.MyViewHolder> {
override fun doSmth(viewHolder: MyViewHolder) {
}
class MyViewHolder : Adapter.ViewHolder {
}
}
Я надеюсь, это то, что вы искали!