内嵌类Kotlin工厂

我正尝试在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 } } 

compilier强调“伴侣”,说“修改器伴侣不适用于内部类”,它也强调InnerClass()调用,说:“表达式不能从嵌套类工厂访问”,使用“内部”关键字,使类内。

我怎样才能达到我想在这里与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 } } } } 

不过以下内容不会在Kotlin中编译

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

出于同样的原因,下面的代码不能用Java 编译

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

这里的罪魁祸首是Kotlin中嵌套的inner类以及Java中嵌套的非静态类对父类实例有一个隐含的引用 。 由于Kotlin旨在与Java高度互操作,它遵循相同的规则。

请参阅以下问题以获得更深入的解释:

  • 为什么Java禁止内部类中的静态字段?
  • 为什么我们不能在(非静态)内部类中使用静态方法? 投票