¿Importar estáticamente los methods de Kotlin Companion?

tl: dr; ¿Es posible import un método dentro de un object complementario de otra class, sin calificar la import con Companion ? Es decir, ¿hay alguna forma posible de que pueda decir import Bar.toFoo lugar de import Bar.Companion.toFoo , suponiendo que el método toFoo es un método en el object complementario de Bar ?


Estamos migrando una class de Java a Kotlin. Nuestra class se ve así:

 class Bar { static Foo toFoo() { return new Foo(); } } 

Y luego, para usarlo, de una class que resulta ser Kotlin, decimos algo como:

 import Bar.toFoo; // ... Bar().convert(toFoo()); // like a Java 8 Collector // ... 

Cuando convertimos Bar a Kotlin, se ve así:

 class Bar { companion object { @JvmStatic fun toFoo() = Foo() } } 

Nos gustaría que el código de llamada funcione sin modificaciones, sin embargo

 import Bar.toFoo 

ya no funciona, ¡incluso con @JvmStatic! En cambio, tenemos que actualizarlo a

 import Bar.Companion.toFoo 

que preferimos no tener que hacer, queremos cambiar la class de Bar a Kotlin sin actualizar las personas que llaman.

¿Pensamientos? Estamos usando Kotlin 1.1.2-2.

A diferencia de Java, Kotlin no le permite llamar miembros estáticos a través de reference de instancia. Java distribuye estos miembros basándose en la statement de time de compilation, por lo tanto, en

 class Bar { static Foo toFoo() { return new Foo(); } } class Foo extends Bar { static Foo toFoo() { return new Foo(); } } class Baz { void test() { Bar fooAsBar = new Foo(); Foo foo = fooAsBar.toFoo(); } } 

En Java, fooAsBar.toFoo() llamará a Bar.toFoo() (el tipo declarado) y no a Foo.toFoo() (el tipo de time de ejecución). Esto es una fuente de malentendidos y no una buena práctica de progtwigción, por lo que Kotlin no lo admite.

Sin embargo, puede definir una function de extensión en la barra:

 fun Bar?.toFoo() = Bar.toFoo() 

Entonces puedes llamar

 val foo = fooAsBar.toFoo() 
  • ¿Cómo se burla de la class Kotlin (final) usando PowerMock?
  • ¿Cuál es el tipo de setContentView ()
  • Al pasar una matriz de Parcelable con Intent.putExtra
  • En kotlin, cómo devolver una instancia definida por un parámetro de class genérico
  • ¿Cómo definir un miembro delegado que se puede anotar en Kotlin?
  • ¿Cuál es el propósito de una statement de object dentro de una class sellada en Kotlin?
  • Kotlin: Un setter pnetworkingeterminado que devuelve "this"
  • Reino que devuelve datos obsoletos
  • Personalizando Kotlin cuando expresión
  • ¿Cómo inyectar oyentes?
  • Joda DateTime Timezone no aparece correctamente