Kotlin Factory en la class anidada interna

Estoy intentando crear una class interna anidada en Kotlin con un método de fábrica de objects complementario (el equivalente de un método de fábrica estático en Java). Aquí hay una versión simplificada de mi código.

class OuterClass { var myData:List<MyData> = List<>() //gets populated elsewhere fun getItemFragment(position:Int) : Fragment() { return InnerClass.Factory.newInstance(position) } inner class InnerClass : Fragment() { companion object Factory { fun newInstance(position:Int) : InnerClass { var ic : InnerClass = InnerClass() var bundle:Bundle = Bundle() bundle.putInt("index", position) ic.arguments = bundle return ic } } override fun onCreateView(inflater:LayoutInflater, container: ViewGroup, savedInstanceState:Bundle): View? { //create and return view, omitted. Need access to myData } } 

El comstackdor resalta "compañero", diciendo "El compañero modificador no es aplicable dentro de la class interna" y también resalta la llamada de InnerClass () diciendo "La expresión es inaccesible de una class anidada Fábrica", usa la palabra key "interna" para hacer que la class .

¿Cómo puedo lograr lo que trato de hacer aquí con el equivalente de un método de fábrica estático en Java?

Tu puedes tener:

 class OuterClass { fun getItemFragment(position: Int): Fragment { return InnerClass.Factory.newInstance(position) } class InnerClass : Fragment() { companion object Factory { fun newInstance(position: Int): InnerClass { var ic: InnerClass = InnerClass() return ic } } } } 

Sin embargo, lo siguiente no se comstackrá en Kotlin:

 class Parent { inner class Nested { companion object Factory { } } } 

Por las mismas razones, lo siguiente no se comstackrá en Java:

 public class Parent { public class Nested { public static boolean create(){ return false; } } } 

El culpable aquí es que las classs inner anidadas en Kotlin, así como las classs anidadas no estáticas en Java tienen una reference implícita a la instancia de la class padre . Dado que Kotlin pretende ser altamente interoperable con Java, sigue la misma regla.

Por favor, consulte las siguientes preguntas para una explicación más detallada:

  • ¿Por qué Java prohíbe campos estáticos en classs internas?
  • ¿Por qué no podemos tener un método estático en una class interna (no estática)? voto arriba
  • Singleton con argumento en Kotlin
  • Kotlin: elementos condicionales durante la creación del map
  • Cómo pasar y get valor de fragment y actividad android kotlin
  • El module debe ser configurado
  • Kotlin: pasar el método array to varargs con el operador spread
  • Cómo implementar el repository de interfaz en otro module de proyecto en AndroidStudio usando Dagger2 y Kotlin
  • Situaciones razonables para usar el `let` de Kotlin
  • Spring MVC Error 404 Bad Request Kotlin
  • No se puede acceder a los componentes internos desde la fuente de testing con Android
  • No se puede establecer ViewModel en Kotlin
  • ¿Cómo get una class de param genérica en Kotlin?