【问题标题】:Kotlin Factory on Inner Nested Class内部嵌套类的 Kotlin 工厂
【发布时间】:2016-04-21 12:50:11
【问题描述】:

我正在尝试使用伴随对象工厂方法(相当于 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
    }
}

编译器突出显示“companion”,表示“修饰符伴侣不适用于内部类”,它还突出显示 InnerClass() 调用,表示“表达式无法从嵌套类工厂访问”,使用“inner”关键字制作类内部。

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

【问题讨论】:

标签: kotlin


【解决方案1】:

你可以拥有:

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 限制。我只需要找到一种不同的方法。谢谢!
  • 这样想:内部类需要一个所有者,你的静态初始化器如何知道所有者应该是谁? (外部类)
猜你喜欢
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 2015-05-29
  • 2015-10-21
相关资源
最近更新 更多