Cómo especificar @Throws para una propiedad en la interfaz

Actualmente estoy transfiriendo un código Java RMI a Kotlin. La interfaz henetworkingada en Java es:

interface Foo: Remote { Bar getBar() throws RemoteException } 

Después de ejecutar la herramienta de migration automática, la bar campo cambia a una propiedad:

 interface Foo: Remote { val bar: Bar } 

Sin embargo, en el progtwig migrado, getBar ya no está marcado como throws RemoteException , lo que causa illegal remote method encountenetworking error de illegal remote method encountenetworking en una llamada RMI.

Me preguntaba si hay alguna manera de marcar @Throws para una propiedad.

Bueno, si miras @Throws :

Si hay un getter específico que no usa el campo de respaldo, simplemente anótelo directamente:

 val bar: Bar @Throws(RemoteException::class) get() = doSomething() 

Los objectives válidos para @Throws son

 AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.CONSTRUCTOR 

Entonces, en otros casos, debe apuntar al getter mismo y no a la propiedad:

 @get:Throws(RemoteException::class) 

La list completa de objectives de sitios de uso admitidos es:

  • file;
  • propiedad (las annotations con este objective no son visibles para Java);
  • campo;
  • get (obtención de properties);
  • set (set de properties);
  • receptor (parámetro receptor de una function o propiedad de extensión);
  • param (parámetro de constructor);
  • setparam (parámetro de configuration de la propiedad);
  • delegar (el campo que almacena la instancia de delegado para una propiedad delegada).

@get especifica que esta anotación se aplicará al getter.

Su interfaz completa sería

 interface Foo: Remote { @get:Throws(RemoteException::class) val bar: Bar } 

Sin embargo, aquí hay un problema: en el código generado, no se genera una cláusula throws . Siento que esto puede ser un error, ya que la anotación está claramente marcada como dirigida a estos cuatro sitios de uso. CONSTRUCTOR y FUNCTION definitivamente funcionan, solo son los que no tienen ninguno.


Eché un vistazo al comstackdor de Kotlin tratando de encontrar una posible razón, y encontré esto :

 interface ReplStateFacade : Remote { @Throws(RemoteException::class) fun getId(): Int ... } 

Que interesantemente evita las properties para usar @Throws . Tal vez esta es una solución conocida?