Котлин аргументы по умолчанию в ошибке интерфейса?

файл kotlin

interface Test { fun test(message: String, delay: Int =100) } class A: Test { override fun test(message: String, delay: Int) { } } 

Я считаю, что не могу использовать @JvmOverloads в интерфейсе или классе.

если я добавлю @JvmOverloads в интерфейсе, ошибка @JvmOverloads annotation cannot be used on interface method , если я добавлю @JvmOverloads в классе, ошибка является platform declaration clash....

Тем не менее, я, похоже, могу использовать параметры по умолчанию в файлах kotlin, например.

 var a=A() a.test("1234") 

Но когда я использую его в java-файле, кажется, что метод не перегружен.

 A a=new A(); a.test("123");//Compile error 

Следующая версия без интерфейса может работать

 class A { @JvmOverloads fun test(message: String, delay: Int=100) { } } 

Тогда я могу использовать его обычно в java-файле

  A a=new A(); a.test("123"); 

Но как поддерживать такую ​​же функциональность после добавления интерфейса?

Это не ошибка. @JvmOverloads аннотации просто не работает с абстрактными методами.

Из документов Котлина:

Обычно, если вы пишете функцию Kotlin со значениями параметров по умолчанию, она будет видна на Java только как полная подпись со всеми присутствующими параметрами. Если вы хотите выставить несколько перегрузок Java-абонентам, вы можете использовать аннотацию @JvmOverloads.

Аннотации также работают для конструкторов, статических методов и т. Д. Его нельзя использовать для абстрактных методов, включая методы, определенные в интерфейсах .

источник: https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#overloads-generation

Зачем? Поскольку, как вы можете узнать из документа, о котором я упоминал, @JvmOverloads инструктирует компилятор генерировать кучу перегруженных Java-методов, опуская каждый из параметров один за другим, начиная с последнего. Насколько я понимаю, каждый перегруженный метод вызывает внутренний метод с еще одним параметром, и этот дополнительный параметр имеет значение по умолчанию. Изменить: см. Комментарий от @hotkey здесь

Это не будет работать с абстрактными методами, потому что у них нет тела. Кроме того, новый интерфейс Java будет иметь больше методов, и его реализациям придется реализовать их все. Интерфейс Kotlin имел только один метод.