内嵌类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禁止内部类中的静态字段?
- 为什么我们不能在(非静态)内部类中使用静态方法? 投票