2014-04-19 10 views
6

Il seguente esempio Scala definisce una classe all'interno di un oggetto pacchetto:Uso classe Scala definita in oggetto pacchetto da Java

package com.mycompany 

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

I seguenti tre classi vengono generate:

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

Il problema sorge quando si cerca utilizzare la classe MyTest da Java. Penso che dal momento che package$MyTest contiene un $ nel nome, Java non sta riconoscendo la sua esistenza. Tuttavia, la classe package$ è accessibile.

esecuzione javap su package$MyTest.class rendimenti:

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

Ho provato l'accesso alla classe utilizzando Eclipse, IntelliJ e Netbeans, senza successo. È possibile utilizzare le classi Scala definite negli oggetti pacchetto da Java?

risposta

5

Definizione di una classe all'interno dell'oggetto pacchettotest non è implementata nello stesso modo come definente all'interno del pacchettotest, anche se probabilmente dovrebbe (questo è tracciato come SI-4344).

A causa di ciò, è generalmente buona norma inserire nell'oggetto del pacchetto solo definizioni che non possono essere di primo livello, come vals, defs, ecc. (Questo è l'intero punto degli oggetti del pacchetto dopo tutto), e lasciare la classe/definizioni di oggetti in un normale definizione del pacchetto:

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

Ciò produrrà un normale MyTest classe, facilmente accessibile da Java:

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

Questo è utile quando sto scrivendo la classe del pacchetto, ma non quando sto usando una libreria di terze parti. –

3

package$MyTest seguente convenzione JVM per le classi nidificate, quindi sarebbe essere visibile come package.MyTest ... eccetto che questo non è un nome legale in Java. Il che significa che non è possibile accedervi.

+0

Quindi .. * allora * cosa ... ho 'type's nell'oggetto pacchetto che sono usati ubiquamente nelle classi nel pacchetto. Quindi ... per tutte le (o più) classi/tratti ecc., Dobbiamo fare un 'import SomeContainer._' dove' SomeContainer' è un'alternativa java-friendly all'oggetto pacchetto? – javadba

+0

Non si può comunque usare 'type's in Java. –

+0

Ho scoperto quel piccolo "trattamento" (nessun 'type's in java ..) subito dopo aver visto questa risposta. Sembra che l'uso di scala framework all'interno di java sia fondamentalmente un non-starter (. Sto creando un adattatore separato per consentire a un sottoinsieme della funzionalità di scala di essere accessibile tramite java. Ciò pone una ferma limitazione alla possibilità di usare scala: it non può essere considerato di uso generale all'interno dei team java/scala: solo java -> scala funziona davvero oltre le cose semplici – javadba

Problemi correlati