内部嵌套类的Kotlin工厂

Joh*_* D. 3 kotlin

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器突出显示"伴侣",说"Modifier伴侣不适用于内部类",它还突出显示了InnerClass()调用,说"表达式是从嵌套类Factory无法访问",使用"inner"关键字使类内部.

如何使用Java中的静态工厂方法实现我在这里尝试做的事情?

mie*_*sol 11

你可以有:

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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是以下内容不会在Kotlin中编译:

class Parent {
    inner class Nested {
        companion object Factory { 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

出于同样的原因,以下内容将无法在Java中编译:

public class Parent {
    public class Nested {
        public static boolean create(){
            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的罪魁祸首是innerKotlin 中的嵌套类以及Java 中的嵌套非静态类具有对父类实例的隐式引用.由于Kotlin旨在与Java高度互操作,因此遵循相同的规则.

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