7 Stimmen

Klassenreferenz für eine innere Java-Klasse

Gibt es eine Möglichkeit, sich auf jede innere Klasse?

Ich würde gerne einen Rückgabetyp angeben, der mit einer inneren Klasse kompatibel ist, z. B.

Class<OuterClass.*> some_method();

Soweit ich weiß, ist diese Syntax ungültig. Gibt es eine Möglichkeit, dies auszudrücken?

Ich weiß, dass ich nicht etwas wie Class<? extends OuterClass> weil eine innere Klasse eine äußere Klasse nicht erweitert.

5voto

Thomas Punkte 84982

Zumindest können Sie sich auf bestimmte innere Klassen beziehen:

<T extends OuterClass.InnerClass> Class<T> some_method()

Abgesehen davon, was würden Sie gewinnen, wenn Sie ein Objekt von jede innere Klasse? Das wäre vergleichbar mit der Rückgabe eines beliebigen Objekts plus der Tatsache, dass die innere Instanz eine besondere Beziehung zur äußeren Instanz hat. Allerdings könnten Sie diese spezielle Beziehung wahrscheinlich ohnehin nicht direkt nutzen.

編集する:

Wie bereits von anderen hervorgehoben wurde InnerClass kann eine Superklasse sein, die durch andere innere Klassen erweitert wird. Dies würde es Ihnen ermöglichen, Folgendes zurückzugeben jede Klasse, die diese Klasse erweitert.

Wenn Sie eine Schnittstelle verwenden würden, sind Sie nicht auf innen Klassen, da man für diese Einschränkung nicht-statische innere Schnittstellen benötigt. Innere Schnittstellen sind jedoch standardmäßig statisch.

3voto

Denys Séguret Punkte 355205

Ich würde lieber eine (innere) Schnittstelle definieren, alle inneren Klassen diese implementieren lassen und dann :

Class<OuterClass.MyInterface> someMethod();

Dies wäre typsicherer als der Versuch, auf eine innere Klasse zu verweisen. Und Sie hätten keine Probleme mehr, wenn Sie eine andere innere Klasse für eine andere Verwendung benötigen oder wenn Sie sich entschließen, eine Klasse zu extrahieren.

0voto

Lukas Eder Punkte 194234

Nein, gibt es nicht. Genauso wenig wie Sie Pakete mit Platzhaltern referenzieren können:

Class<com.example.*> some_method();
Class<com.example.?> some_method();

Die Anwendungsfälle für solche Erklärungen wären so begrenzt, dass sie einfach nicht in die JLS aufgenommen werden könnten. Beachten Sie, dass Sie solche "location match types" auch nicht außerhalb des Geltungsbereichs von Generics verwenden können. Z.B. können Sie nicht deklarieren:

void some_method(OuterClass.*  argument);
void some_method(com.example.* argument);

0voto

Nandkumar Tekale Punkte 15494

Sie können eine Marker-Schnittstelle definieren und diese durch eine innere Klasse implementieren.

<T implements CustomMarkerInterface> Class<T> some_method()

Dies würde also für alle inneren Klassen von OuterClass

public class Outer {

    public class Inner implements CustomMarkerInterface{

    }

    public class Inner1 implements CustomMarkerInterface{

    }

    public class Inner2 implements CustomMarkerInterface{

    }

}

0voto

Amit Deshpande Punkte 18721

Class<InnerClass> ist in Java erlaubt. Suchen Sie nach etwas Bestimmten?

public class Client
{
interface InnerType
{
}
public class InnerClass implements InnerType
{
}
public Class<? extends Client.InnerType> test()
{
    return InnerClass.class;
}

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X