2016-01-15 52 views
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 
    } 
} 

的compilier亮點「同伴」,並稱「修改的伴侶是不適用的內部類中」,這也凸顯了將InnerClass()電話,稱「表達式是嵌套類工廠無法訪問」,用「內「關鍵字使班級內在。

如何在Java中使用靜態工廠方法實現我想要實現的目標?

+0

你不應該做一個片段的內部類,因爲它需要一個零參數的構造函數。更多關於該主題:http://stackoverflow.com/questions/15571010/fragment-inner-class-should-be-static –

回答

6

您可以:

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

但是以下不會科特林編譯

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高度互操作,它遵循相同的規則。

請參閱下面的問題進行更深入的解釋:

+0

你知道什麼,這一切都有道理。發佈問題後,我認爲它可能也是Java的限制。我只需要找到一種不同的方法。謝謝! –

+0

想想這樣:內部類需要一個所有者,你的靜態初始化器如何知道所有者應該是誰? (外部類) –