2014-04-19 22 views
6

以下Scala的例子在包對象中定義使用的Scala類定義了一個包對象內部的類:從Java

package com.mycompany 

package object test { 
    class MyTest { 
    def foo(): Int = { 
     42 
    } 
    } 
} 

以下三個類生成使用Java的MyTest類。我認爲,由於package$MyTest包含一個$的名字,Java並不承認它的存在。儘管如此,package$類是可訪問的。

package$MyTest.class回報運行javap

Compiled from "Test.scala" 
public class com.mycompany.test.package$MyTest { 
    public int foo(); 
    public com.mycompany.test.package$MyTest(); 
} 

我試圖訪問使用Eclipse,的IntelliJ和Netbeans類,都沒有成功。 是否可以使用在Java包對象中定義的Scala類?

回答

5

定義包對象test內部的類目前未實現的相同方式定義test內,儘管它可能應該(這是被跟蹤爲SI-4344)。

因此,通常只需將不能爲頂層的定義放入包對象中,比如vals,defs等(這是所有包對象的關鍵點),然後離開類/對象定義成一個正常的包定義:

package com.mycompany 

package object test { 
    // vals, defs, vars, etc. 
    val foobar = 42 
} 

package test { 
    // classes, objects, traits, etc. 
    class MyTest { 
    def foo(): Int = { 
     42 
    } 
    } 
} 

這將產生一個正常MyTest類,方便從Java:

com/mycompany/test/MyTest.class 
com/mycompany/test/package.class 
com/mycompany/test/package$.class 
+1

這時候我寫了包類,但是當我使用的不是第三方庫是非常有用的。 –

3

package$MyTest如下JVM約定嵌套類,所以它會可見爲package.MyTest ...除非這不是Java中的合法名稱。這意味着它無法訪問。

+0

所以.. *然後*什麼..我有包裝對象中的類型''在包中的類中普遍使用。然後..對於所有(大約100個)類/特徵等,我們需要執行一個'Import SomeContainer._',其中'SomeContainer'是包對象的一個​​java友好的替代品? – javadba

+0

無論如何,你不能在Java中使用'type's。 –

+0

我在看到這個答案後不久就發現了這個小「治療」(在java中沒有'type's)。看起來,在java中使用scala框架基本上是一個非啓動器;(。我創建了一個單獨的適配器,以允許通過Java訪問scala功能的一個子集,這對使用scala的能力造成了嚴格的限制:它在java/scala團隊中不能被認爲是通用目的:只有java - > scala確實可以超越簡單的東西 – javadba