2014-04-19 11 views
6

Poniższy przykład Scala definiuje klasę wewnątrz obiektu pakiet:Korzystanie klasa Scala zdefiniowane w obiekcie opakowania z Java

package com.mycompany 

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

trzech następujących klas generowane są:

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

Problem pojawia się podczas próby używać klasy MyTest z Java. Myślę, że od package$MyTest zawiera $ w nazwie, Java nie uznaje jej istnienia. Niemniej jednak dostępna jest klasa package$.

Running javap na package$MyTest.class zwrotów:

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

Próbowałem dostępu do klasy przy użyciu Eclipse, IntelliJ i Netbeans, bez powodzenia. Czy można używać klas Scala zdefiniowanych w obiektach pakietów z Java?

Odpowiedz

5

Definiowanie klasy wewnątrz obiektu pakietutest nie jest obecnie realizowany w taki sam sposób jak jego zdefiniowaniem wewnątrz opakowaniatest, choć prawdopodobnie powinien (to jest śledzony jako SI-4344).

Zwykle dobrą praktyką jest umieszczanie w obiekcie pakietu tylko definicji, które nie mogą być na najwyższym poziomie, takich jak vals, defs, itp. (To przecież cały punkt obiektów pakietu) i pozostawić klasę/definicje obiektów do normalnego definicji pakietu:

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

to będzie produkować normalne MyTest klasę, łatwo dostępne z Java:

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

Jest to przydatne, gdy piszę klasę pakietu, ale nie wtedy, gdy używam biblioteki innej firmy. –

3

package$MyTest następuje konwencję JVM dla klas zagnieżdżonych, tak by być widoczne jako package.MyTest ... z tym że nie jest to prawna nazwa w Javie. Co oznacza, że ​​nie można uzyskać do niego dostępu.

+0

So .. * then * what .. Mam 'type's w obiekcie pakietu, które są używane wszędzie w klasach w pakiecie. Następnie ... dla wszystkich (około stu) klas/cech itp. Musimy wykonać 'import SomeContainer._', gdzie' SomeContainer' jest przyjazną dla java alternatywą dla obiektu pakietu? – javadba

+0

Mimo to nie można używać "typów" w Javie. –

+0

Odkryłem tę małą "przyjemność" (brak "typu" w Javie ..) wkrótce po zobaczeniu tej odpowiedzi. Wygląda na to, że używanie struktury scala w java jest w zasadzie nierozłączne (tworzę osobny adapter, aby umożliwić dostęp do podzbioru funkcji scala za pośrednictwem java, co powoduje silne ograniczenie możliwości używania scala: it nie może być uważany za ogólny cel w ramach zespołów java/scala: tylko java -> scala działa naprawdę poza prostymi rzeczami – javadba

Powiązane problemy