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
  • ¿Por qué IntelliJ Idea no encuentra las dependencies de Maven de otro module de Kotlin?
  • Implementar Hashmap con diferentes types de valores en Kotlin
  • Kotlin Dagger2 no puede encontrar el símbolo ApplicationModule_ProvideApplicationFactory
  • Kotlin: unidad testing afirmar object después de gson
  • Referencia al método de una instancia particular en Kotlin
  • Cómo usar la dependency injection en las testings de Spek
  • romper o continuar saltar a través del límite de class kotlin
  • Los generics de Kotlin esperan un tipo inesperado
  • Kotlin Date.daysDespués de la function diferente valor de retorno con los mismos arguments
  • Lista de edición de Kotlin
  • ¿Cómo hacer una propiedad opcional / nulable en hibernate-validator?