内部嵌套的 Kotlin 工厂 Class

Kotlin Factory on Inner Nested Class

我正在尝试使用伴随对象工厂方法(相当于 Java 中的静态工厂方法)在 Kotlin 中创建嵌套内部 class。这是我的代码的简化版本。

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

编译器突出显示 "companion",说 "Modifier companion is not applicable inside inner class" 并且它还突出显示 InnerClass() 调用,说 "Expression is inaccessible from a nested class Factory",使用 "inner" 关键字使 class 内.

如何使用 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 classes,以及 Java 中的嵌套非静态 classes对 parent class 实例的隐式引用。由于 Kotlin 旨在与 Java 高度互操作,因此它遵循相同的规则。

更多in-depth解释请看以下问题: