// FILE: JavaProperty.java @ValueContainer public interface JavaProperty { void assign(T argument); T get(); } // FILE: JavaClassStringProperty.java @ValueContainer public class JavaClassStringProperty { private String v; public JavaClassStringProperty(String v) { this.v = v; } public void assign(String v) { this.v = v; } public String get() { return v; } } // FILE: test.kt annotation class ValueContainer data class JavaStringProperty(private var v: String): JavaProperty { override fun assign(v: String) { this.v = v } override fun get() = this.v } @ValueContainer interface KotlinProperty { fun assign(argument: T); fun get(): T; } data class KotlinStringProperty(private var v: String): KotlinProperty { override fun assign(v: String) { this.v = v } override fun get() = this.v } abstract class KotlinAbstractStringProperty: KotlinProperty data class KotlinStringProperty2(private var v: String): KotlinAbstractStringProperty() { override fun assign(v: String) { this.v = v } override fun get() = this.v } @ValueContainer data class KotlinClassStringProperty(private var v: String) { fun assign(v: String) { this.v = v } fun get(): String { return v } } fun `should work with annotation on Java interface`(): String { data class Task(val input: JavaStringProperty) val task = Task(JavaStringProperty("Fail")) task.input = "OK" return if (task.input.get() != "OK") { "Fail: ${task.input.get()}" } else { "OK" } } fun `should work with annotation on Java class`(): String { data class Task(val input: JavaClassStringProperty) val task = Task(JavaClassStringProperty("Fail")) task.input = "OK" return if (task.input.get() != "OK") { "Fail: ${task.input.get()}" } else { "OK" } } fun `should work with annotation on Kotlin interface`(): String { data class Task(val input: KotlinStringProperty) val task = Task(KotlinStringProperty("Fail")) task.input = "OK" return if (task.input.get() != "OK") { "Fail: ${task.input.get()}" } else { "OK" } } fun `should work with annotation on Kotlin interface via intermediate supertype`(): String { data class Task(val input: KotlinStringProperty2) val task = Task(KotlinStringProperty2("Fail")) task.input = "OK" return if (task.input.get() != "OK") { "Fail: ${task.input.get()}" } else { "OK" } } fun `should work with annotation on Kotlin class`(): String { data class Task(val input: KotlinClassStringProperty) val task = Task(KotlinClassStringProperty("Fail")) task.input = "OK" return if (task.input.get() != "OK") { "Fail: ${task.input.get()}" } else { "OK" } } fun box(): String { var result = `should work with annotation on Java interface`() if (result != "OK") return result result = `should work with annotation on Java class`() if (result != "OK") return result result = `should work with annotation on Kotlin interface`() if (result != "OK") return result result = `should work with annotation on Kotlin class`() if (result != "OK") return result return "OK" }