内部嵌套的 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解释请看以下问题:
- Why does Java prohibit static fields in inner classes?
- 为什么我们不能在 (non-static) 内部 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解释请看以下问题:
- Why does Java prohibit static fields in inner classes?
- 为什么我们不能在 (non-static) 内部 class 中使用静态方法? 赞成票