2014-09-04 41 views
0

我想爲某些導入的Java類型創建伴隨對象,因此我不必使用new來分配它們。我想從類型Vector3f開始,它是從jMonkeyEngine的com.jme3.math中導入的。爲從Java導入的類創建伴隨對象

我想的是:

package com.jme3.math 

object Vector3f { 
    def apply() = new Vector3f() 
    def apply(x:Float, y:Float, z:Float) = new Vector3f(x,y,z) 
} 

編譯時,我得到錯誤:

Error:(8, 21) not found: type Vector3f def apply() = new Vector3f()

當我添加import com.jme3.math.Vector3f,我得到警告,這或許可以解釋我所看到的:

Warning:(3, 22) imported `Vector3f' is permanently hidden by definition of object Vector3f in package math

如何爲com.jme3.math.Vector3f或其他類型的導入創建伴隨對象從Java編輯?

+0

可能重複在Java中定義的類?](http://stackoverflow.com/questions/4921827/in-scala-how-can-i-define-a-companion-object-for-a-class-defined-in-java) – Suma 2014-09-04 11:59:26

回答

1

這是一個命名問題,你不能同時擁有同名的Java類和Scala伴侶對象。

您可以使用完全限定名稱new com.jme3.math.Vector3f(...)訪問伴隨對象中的Java類,也可以在導入時指定不同的本地名稱。

import com.jme3.math.{ Vector3f => JV3 } 

def apply(): JV3 = new JV3() 

額外的例子(用於Java類org.apache.http.HttpClient同伴對象):

import org.apache.http.client.{ HttpClient ⇒ HC } 

object HttpClient { 
    def apply(): HC = ??? 
} 

或者......

// No import 
object HttpClient { 
    def apply(): org.apache.http.client.HttpClient = ??? 
} 
的[在Scala中,我怎麼能定義一個同伴對象
+0

我已經嘗試過「使用Java訪問伴隨對象內的Java類」完全限定名新com.jme3.math.Vector3f「,但是這仍然給我錯誤:」類型Vector3f不是包com.jme3.math的成員「。我想我可能不應該使用與我導入的Java相同的軟件包名稱? ^ – Suma 2014-09-04 10:00:16

+1

您不應使用相同的軟件包名稱定義伴隨對象。首先造成技術問題,那麼只有原始Java lib的類必須在這個包中定義,以尊重作者和責任的區別。 – cchantep 2014-09-04 10:18:55

+0

當我使用不同的軟件包名稱時,這種方法很有用。沒有錯誤,但有警告「導入的Vector3f」被包樹中的對象Vector3f的定義永久隱藏「。然而,沒有錯誤,儘管警告Vector3f似乎工作正常,即使在伴隨對象本身中也沒有必要指定com.jme3.math,我可以使用= new Vector3f。奇怪。 – Suma 2014-09-04 11:38:24