2013-10-29 23 views
5

Jeśli mam następujące klasy zdefiniowanej w javascala przesłanianie java metoda klasy, która odwołuje klasa wewnętrzna

public class A 
{ 
    protected class B 
    { 
    } 

    protected void method(B b) {...} 
} 

I chcę dziedziczą z niego Scala i metody obejścia. Ja bym nadzieję, wykonaj następujące czynności:

class C extends A { 

    override def method(b: B): Unit = { 
    // ... do something 
    super.method(b) 
    } 
} 

Jednak kompilator Scala nie lubi, gdy robię to w ten sposób daje następujący błąd:

metoda metoda zasłania niczego. Uwaga: super klasy klasy C zawierają następujące, nie końcowe nazwy o nazwie metoda: protected [pakiet ...] metoda def (x $ 1: A # B): Jednostka

Jedyny sposób, w jaki mogę to zrobić jest wykonanie następujących czynności:

class C extends A { 

    override def method(b: A#B): Unit = { 
    // ... do something 
    super.method(b.asInstanceOf[this.B]) 
    } 
} 

Uważam konieczności zrobić to dość brzydki i zastanawiałem się, czy nie było neater sposób to zrobić?

Dzięki

Des

Odpowiedz

1

Oczywistym kod działa dla mnie:

public class A { 
    public class B {} 
    protected void method(B b) { 
    System.out.println("A#method"); 
    } 
} 

class C extends A { 
    override def method(b: B): Unit = { 
    println("C#method") 
    super.method(b) 
    } 
} 

Następnie w konsoli SBT:

scala> new C 
res0: C = [email protected] 

scala> new res0.B 
res1: res0.B = [email protected] 

scala> res0.method(res1) 
C#method [email protected] 
A#method [email protected] 

Jednak, gdybym wtedy zmodyfikować C .scala i uzyskać sbt, aby wykonać ponowną rekompilację, Dostaję błąd, który widzisz (testowany z wersją 0.12.4 i 0.13.0) - może warto napisać o tym błąd sbt.

+0

Problem wydaje się być związany z kompilatorem działającym w środowisku Eclipse. Testowałem go z sbt i działa on zgodnie z oczekiwaniami, tak jak powiedziałeś - w rzeczywistości zmiany, które wprowadziłem w celu kompilacji w ramach Eclipse, nie działają w ramach kompilacji sbt. Zbadam dalej, aby spróbować dowiedzieć się o problemie z zaćmieniem. – user79074

+0

Zgaduję, problem jest z kompilatorem, jak to się dzieje również w ramach Zaćmienie. Odtworzono za pomocą Scala 2.9.2 i Scala 2.10.1. Więc zgłosili błąd w projekcie scala lang. – user79074

+0

[SI-7946] (https://issues.scala-lang.org/browse/SI-7946), dla osób grających w domu. – Hugh

Powiązane problemy