Используя черты с классами данных в Котлине?

У меня есть два объекта модели / DTO, определенные как классы данных

public data class ModelA(val limit: Int, val offset: Int, val someDataA: DataAlpha) public data class ModelB(val limit: Int, val offset: Int, val someDataB: DataBeta) 

Я хотел бы обобщить разбивку на страницы на основе чего-то типа Paginable :

 trait Paginable { var limit: Int var offset: Int } 

Но создание ModelA для реализации Paginable вызывает ошибку:

Ошибка: «offset» скрывает член супертипа «Paginable» и нуждается в модификации «переопределить»

Добавление переопределения :

 public data class ModelB(override val limit: Int, override val offset: Int, val someDataB: DataBeta) : Paginable 

вызывает еще более интересную ошибку, сбой компилятора:

 Error:java.lang.ClassCastException: org.jetbrains.kotlin.psi.JetParameter cannot be cast to org.jetbrains.kotlin.psi.JetProperty at org.jetbrains.kotlin.resolve.OverrideResolver$3.varOverriddenByVal(OverrideResolver.java:562) at org.jetbrains.kotlin.resolve.OverrideResolver.checkOverridesForMemberMarkedOverride(OverrideResolver.java:606) at org.jetbrains.kotlin.resolve.OverrideResolver.checkOverrideForMember(OverrideResolver.java:529) at org.jetbrains.kotlin.resolve.OverrideResolver.checkOverridesInAClass(OverrideResolver.java:269) at org.jetbrains.kotlin.resolve.OverrideResolver.checkOverrides(OverrideResolver.java:260) at org.jetbrains.kotlin.resolve.OverrideResolver.check(OverrideResolver.java:67) at org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer.analyzeDeclarations(LazyTopDownAnalyzer.java:299) at org.jetbrains.kotlin.resolve.LazyTopDownAnalyzerForTopLevel.analyzeDeclarations(LazyTopDownAnalyzerForTopLevel.java:77) at org.jetbrains.kotlin.resolve.LazyTopDownAnalyzerForTopLevel.analyzeFiles(LazyTopDownAnalyzerForTopLevel.java:69) at org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.java:147) at org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegrationWithCustomContext(TopDownAnalyzerFacadeForJVM.java:100) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$2.invoke(KotlinToJVMBytecodeCompiler.java:307) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$2.invoke(KotlinToJVMBytecodeCompiler.java:300) at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.java:232) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.java:299) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyzeAndGenerate(KotlinToJVMBytecodeCompiler.java:282) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileBunchOfSources(KotlinToJVMBytecodeCompiler.java:208) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.java:189) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.java:49) at org.jetbrains.kotlin.cli.common.CLICompiler.exec(CLICompiler.java:148) at org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile.callCompiler(Tasks.kt:86) at org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile.compile(Tasks.kt:62) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:218) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:211) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:200) at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:579) at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:562) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35) at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64) at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53) at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) 

Я знаю, что эта черта может быть реализована «вручную» внутри тела класса, но это сломает класс данных как equals , hashCode и copy игнорирует добавленные свойства.

    Вы можете исправить свой код, используя тот же вид свойства ( val / var ) в обеих сторонах ( data class и data class ).

    Interesting Posts

    Как я могу сделать параметр IntelliJ refactor-> rename только переименовать локальную версию? (Котлин)

    Kotlin JS и GWT interop

    Объединить флаги и четкую следы в котлине

    Как использовать Spring Data JPA методы, возвращающие поток в блок try-with-resources в Котлине?

    Вызов Kotlin из Java – ошибка: демо-версия пакета не существует

    Доступ к идентификаторам ресурсов с использованием Kotlin & Anko

    Функцию можно написать в Котлине (т.е. на верхнем уровне). Могу ли я также тестировать те, кто находится на верхнем уровне?

    Класс не найден в котлин?

    Как добавить приложение create-react-kotlin-app в качестве модуля для проекта kotlin-multiplatform?

    Android посыльный – писать с нулевым длинным

    В чем разница между «const» и «val»?

    Должен ли я использовать демо-код ARCore или написать его самостоятельно?

    Вызов REST api на эмулятор android вызывает приложение к сбою

    Обработка аннотаций с помощью kapt Android Studio

    Соответствие регулярных выражений в строке

    Давайте будем гением компьютера.