2015-05-28 42 views
16

Ich habe grundsätzlich eine Frage darüber, warum das Folgende nicht funktioniert. Ich habe eine abstrakte Klasse:Verwenden eines verschachtelten Typs als generisches Typargument in der Supertype-Deklaration der umschließenden Klasse

public abstract class Abstrct <T> { 

} 

ich dann eine Klasse definieren, die Verwendung dieser Klasse mit einem öffentlichen inneren Klasse macht definiert, dass ich für den generischen Parameter verwenden möchten, wie folgt:

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

    } 
} 

Da ich immer noch Java lerne, interessiert mich mehr, warum es nicht funktioniert. Nicht so sehr, wie es funktioniert, aber das würde mich auch interessieren.

Antwort

17

Inner ist nicht im Bereich für die Klassendeklaration von Outer. Es ist kein bekannter Typname, wenn es in der extends Klausel verwendet wird. Verwenden Sie eine qualifizierte Referenz:

class Outer extends Abstract<Outer.Inner> 

Oder importieren:

import com.example.Outer.Inner; 

Aus der Beschreibung in Bezug auf Scope:

Der Umfang einer Erklärung eines Mitglieds m erklärt in oder vererbt Eine Klassentyp C (§8.1.6) ist der gesamte Körper C, einschließlich aller verschachtelten Typdeklarationen.

Die extends Klausel ist Teil der Klasse Superclass Erklärung, wie sie in den Specification beschrieben. Es ist nicht Teil des Klassenkörpers.

Der Umfang eines in einer import Anweisung Typ jedoch

[..] ist alle Klassen- und Interface-Typdeklarationen (§7.6) in der Übersetzungseinheit in dem die Einfuhr Erklärung erscheint, sowie alle Anmerkungen auf die Paket-Deklaration (falls vorhanden) der Kompilierungseinheit.

+6

Oder einfach erklären 'public class Outer erstreckt Abstrakt '. – RealSkeptic

7

Sie können Abstrct<Outer.Inner> verwenden, um den Typ eindeutig und gültig zu machen.

0

Sie müssen explizit sein, da die von Ihnen definierte innere Klasse nicht statisch ist und daher nur innerhalb des Umfangs der enthaltenen Klasse existiert. (Siehe https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html)

In Ihrem Fall versuchen Sie folgende:

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

    } 
} 
+0

Selbst wenn es statisch wäre, müssten sie es trotzdem importieren oder einen qualifizierten Typnamen verwenden. –

Verwandte Themen