2015-05-28 9 views
16

Zasadniczo mam pytanie, dlaczego poniższe elementy nie działają. Mam klasy abstrakcyjnej:Używanie typu zagnieżdżonego jako ogólnego argumentu typu w deklaracji nadrzędnej klasy otaczającej

public abstract class Abstrct <T> { 

} 

I wtedy zdefiniować klasę, która korzysta z tej klasy z publicznych klasy wewnętrznej zdefiniowanej że chcę użyć parametru rodzajowego, jak następuje:

public class Outer extends Abstrct<Inner> { 
    public class Inner { 

    } 
} 

Ponieważ wciąż uczę się Java, jestem bardziej zainteresowany tym, dlaczego to nie działa. Nie tyle, żeby to działało, ale też byłbym tym zainteresowany.

Odpowiedz

17

Inner nie znajduje się w zakresie deklaracji klasy Outer. Nie jest to znana nazwa typu, jeśli jest używana w klauzuli extends. Użyj wykwalifikowanego odniesienie:

class Outer extends Abstract<Outer.Inner> 

lub importować go:

import com.example.Outer.Inner; 

ze specyfikacji, w odniesieniu Scope:

zakresu stosowania deklaracji członka m zadeklarowanej lub odziedziczonego przez a klasa typu C (§8.1.6) to całe ciało C, w tym wszelkie deklaracje typu zagnieżdżonych .

Klauzula extends jest częścią klasy Superclass deklaracji, jak opisano w Specification. To nie jest częścią ciała klasowego.

Zakres typu stosowanego w instrukcji import jednak

[..] to wszystkie zgłoszenia klas i typów INTERFEJS (§7.6) w jednostce, w której kompilacji import deklaracja pojawia się, a także wszelkie adnotacje na deklaracji pakietu (jeśli istnieje) jednostki kompilacji.

+6

Albo po prostu zadeklarować 'public class Outer rozciąga Streszczenie '. – RealSkeptic

7

Można użyć Abstrct<Outer.Inner>, dzięki czemu typ jest jednoznaczny i prawidłowy.

0

Należy jawnie, ponieważ zdefiniowana klasa wewnętrzna nie jest statyczna, więc istnieje tylko w zakresie klasy zawierającej. (Patrz https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html)

W twoim przypadku spróbuj następujących:

public class Outer extends Abstrct<Outer.Inner> { 
    public class Inner { 

    } 
} 
+0

Nawet jeśli był statyczny, nadal musiałby go zaimportować lub użyć kwalifikowanej nazwy typu. –

Powiązane problemy