Ich habe eine Basisklasse mit einer abstrakten getType() -Methode. Ich möchte, dass Unterklassen diese Methode implementieren und die tatsächlich zu verwendende Klasse bereitstellen können.Geben Sie einen verschachtelten Klassentyp in Java zurück
Im Code in etwa wie folgt:
public abstract class A {
public static interface Tile;
protected abstract Class<Tile> getTileClass();
}
public class B extends A {
public static class MyTile implements A.Tile { }
@Override
protected abstract Class<A.Tile> getTileClass() {
MyTile t = new MyTile(); // WORKS
return MyTile; // ERROR HERE
}
}
Das Problem hier ist, dass ich markierte in der Zeile "MyTile kann nicht aufgelöst werden". Also versuche ich, diese stattdessen zurück.
Rückkehr neue MyTile() getClass()
aber jetzt von Eclipse sagt mir:
Typenkonflikt: Konvertierung von Klasse
<
erfassen # 1-von? erstreckt B.MyTile>
Klasse<
A.Tile>
, die ich nicht einmal sicher bin, ob vielleicht ein Fehler in Eclipse gibt es hier oben (Capture # 1?).
Als nächstes gebe ich Interfaces auf und versuche, eine abstrakte Tile-Basisklasse zu verwenden. Mit etwas Hilfe von Eclipse beende ich mit dem folgenden Code auf, die zu kompilieren scheint:
public abstract class A {
public static abstract class Tile;
protected abstract Class<? extends Tile> getTileClass();
}
public class B extends A {
public static class MyTile exends A.Tile { }
@Override
protected abstract Class<? extends A.Tile> getTileClass() {
return new MyTile().getClass(); // WORKS
return MyTile; // "Cannot be resolved"
}
}
Also im Grunde scheine ich drei Fragen zu haben:
1) Ist es möglich, dies mit A zur Arbeit zu kommen .Tile als Schnittstelle?
2) Bei Verwendung einer Basisklasse ist Class<? extends X>
wirklich der richtige Weg?
3) Und wie kann ich meine verschachtelte B.MyTile-Klassenreferenz innerhalb der Methode zurückgeben? new MyTile().getClass()
zu tun, kann nicht stimmen, oder?
Wahrscheinlich ist es eine schlechte Idee, ein 'Class' anstelle eines nicht reflektierenden Objekts zurückzugeben. –
@Tom Bei der Rückgabe einer Klasse im Kontext der geprüften Typen handelt es sich um ein sehr häufiges Muster, mit dem Sie den * checked * -Typ z. B. einer Sammlung zur Laufzeit überprüfen können. Ich kenne keinen anderen Weg, in der Tat ... –
Varkhan