Intereting Posts
Цвет фона и перетасовка изображений в режиме прокрутки в recyclerView Android с помощью группового адаптера Kotlin весело возвращается преждевременно Как назначить значение параметру KMutableProperty? Пользовательский Джерси ExceptionMapper весной Boot с kotlin Kotlin, Java, JSTL Boolean interop Почему Kotlin Array <T> не реализует Iterable <T> Kotlin: Что я могу сделать, если в библиотеке Java есть перегрузка как примитивного, так и вложенного типа? Разница между нитью и сопрограммой в Котлине Предоставляет ли Kotlin какие-либо реализации своих интерфейсов сбора данных? Gradle не загружает репозиторий Kotlin Операции ленивого потока и неразрешенная ссылка для потока () Сгенерированный метод toString для включения членов из базового класса? Kotlin: Как дочерний класс может использовать функцию расширения родителя в вызове супер-конструктора? Диффузия и мультивыбор Захват изображений и видео, таких как рассказы Snapchat / Instagram

Завод Котлин на внутреннем вложенном классе

Я пытаюсь создать встроенный внутренний класс в Kotlin с помощью метода фабрики сопутствующих объектов (эквивалент статического заводского метода в Java). Вот упрощенная версия моего кода.

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 } } 

Компилятор выделяет «компаньон», говоря, что «Сопротивление модификатора не применимо внутри внутреннего класса», а также подчеркивает вызов InnerClass (), говоря: «Выражение недоступно из вложенного класса Factory», используйте ключевое слово «inner», чтобы сделать внутренний класс ,

Как я могу достичь того, что я пытаюсь сделать здесь, с эквивалентом статического заводского метода в Java?

Вы можете иметь:

 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 } } } } 

Однако в Котлине не будет компилироваться следующее :

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

По тем же причинам следующее не будет компилироваться в Java:

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

Суть здесь заключается в том, что вложенные inner классы в Kotlin, а также вложенные нестатические классы в Java имеют неявную ссылку на экземпляр родительского класса. Поскольку Kotlin стремится к высокому взаимодействию с Java, он следует тому же правилу.

Пожалуйста, ознакомьтесь с следующими вопросами для более подробного объяснения:

  • Почему Java запрещает статические поля во внутренних классах?
  • Почему у нас нет статического метода в (нестационарном) внутреннем классе? голосование