2011-06-25 9 views
11

Piszę klasę Scala, która dziedziczy z klasy Java, i muszę zastąpić metodę, która przyjmuje chronioną wewnętrzną klasę Javy jako parametr. Zależność Java występuje jako jar bez kodu źródłowego.Jak odnieść się do chronionej klasy wewnętrznej w Scali, gdy dziedziczy z Javy (tylko z kodem bajtu)

Mam dokładnie takie same ustawienia, jak w https://issues.scala-lang.org/browse/SI-3120, z tym że nie mam dostępnego kodu źródłowego Java, więc skalak wie tylko o zależnościach Java, patrząc na kod bajtowy (w plikach jar lub class).

To jest w zasadzie to, co usiłuję zrobić:

// javapkg/JavaSuperClass.java 
package javapkg; 
public class JavaSuperClass { 
    protected class JavaInnerClass { 
    } 
    public void method(JavaInnerClass javaInnerclass) { 
     System.out.println("hello"); 
    } 
} 

// scalapkg/ScalaSubClass.scala 
package scalapkg 
import javapkg.JavaSuperClass 
class ScalaSubClass extends JavaSuperClass { 
    override def method(javaInnerClass: JavaSuperClass#JavaInnerClass) { 
    println("world") 
    } 
} 

Mam Sun Java JDK Hotspot 1.6.0_24 i Scala 2.9.0.1 w systemie Linux. To, co się dzieje:

$ cd javapkg 
$ javac JavaSuperClass.java 
$ cd ../scalapkg 
$ scalac -cp .. ScalaSubClass.scala 
ScalaSubClass.scala:6: error: class JavaInnerClass in class JavaSuperClass cannot be accessed in javapkg.JavaSuperClass 
Access to protected class JavaInnerClass not permitted because 
prefix type javapkg.JavaSuperClass does not conform to 
class ScalaSubClass in package scalapkg where the access take place 
    override def method(javaInnerclass: JavaSuperClass#JavaInnerClass) { 
                ^
one error found 

Uwaga, jeśli zmienię JavaSuperClass#JavaInnerClass po prostu JavaInnerClass, mam to:

ScalaSubClass.scala:6: error: method method overrides nothing 
    override def method(javaInnerClass: JavaInnerClass) { 
      ^
one error found 

Uwaga: Wiem, że to brzmi bardzo podobnie do wspólnej "protected static inner class" Java-compatibility issue in Scala, ale wierzę, że to nie ma związku, ponieważ w moim przykładzie nie ma żadnych statyki.

Czuję, że coś jest nie tak, ponieważ kiedy wstawiłem ten sam kod do mieszanego projektu java/scala w Eclipse, wydawało się, że kompiluje się dobrze (z ostatnią składnią JavaInnerClass); dopiero wtedy, gdy skompiluję kod Scala tylko z kodem bajtowym Java (i bez kodu źródłowego Java), nie mogę go uruchomić. Czy po prostu brakuje mi poprawnej składni odnoszącej się do wewnętrznej klasy Java, czy jest to znana wada, czy powinienem zgłosić błąd kompilatora? Nie mogłem znaleźć nic na temat tego konkretnego przypadku użycia w moich poszukiwaniach.

+0

Czy nie działa "JavaSuperClass.JavaInnerClass"? –

+0

Nie, mówi "typ JavaInnerClass nie jest członkiem obiektu javapkg.JavaSuperClass" – Mike

Odpowiedz

1

This to doskonały artykuł omawiający ten temat.

EDIT-1

Moje złe, odpowiedziałem szybko. To właściwie może być błąd Mike, próbuję sprawdzić, czy uda mi się znaleźć jakiś hack. Dam ci znać, jeśli ją znajdę.

EDIT-2

Próbowałem różnych rzeczy, ale nie mogę znaleźć sposób, aby to działało. Mike Proponuję Ci złożyć zgłoszenie błędu.

+1

Dziękuję za próbę zmuszenia go do pracy i potwierdzenie, że to nie tylko ja. Zgłaszałem tutaj błąd: https://issues.scala-lang.org/browse/SI-4737 – Mike

+0

Bez problemu Mike. Zobaczmy, co myślą olbrzymy;) –

Powiązane problemy