2013-04-23 34 views
0

當我運行下面的代碼的應用方法不被稱爲:這個應用方法是否正確定義?

的Java:

public class Driver { 

    public static void main(String args[]){ 

     new parallel.TestData(); 
    } 

} 

斯卡拉:

package parallel 

class TestData { 
    def apply() = { 
     println("in apply method ") 
    } 
} 

如果我使用:

new parallel.TestData().apply(); 

則apply方法被正確調用,但是apply()方法不是隱式的從上面的代碼調用?申請方法沒有正確實施?

回答

2

在斯卡拉,構造函數適用方法之間存在差異。看來你期望apply方法像構造函數一樣行事。但是,構造函數是一個名爲def this(...)的方法。因此,你沒有定義一個構造函數。

可以通過使用名稱就像調用任何其他方法(.apply())或通過使用偏旁(())來調用apply方法。在創建了類的新實例之後,仍然需要調用apply方法。

你可以這樣既創建類的新實例,並調用apply

new parallel.TestData()() 
//     ^^---- apply method 
//     |------- constructor 

或者你也可以實現一個對象,而不是一類的:

object TestData { 
    def apply() = { 
     println("in apply method ") 
    } 
} 
parallel.TestData() 

更新:從Java調用Scala代碼時,您必須堅持第一種方法。由於Java不會爲apply方法添加語法糖,因此您可以選擇顯式調用:new parallel.TestData().apply()

+1

對象不能從java實例化,因爲它的對象而不是類? – 2013-04-23 14:08:26