Erweitern einer Klasse mit Generics

WeirdAl

Bekanntes Mitglied
Hallo zusammen,
ich habe folgendes Problem:
Ich habe eine Menge von Klassen die alle A extenden (... extends A). In A habe ich eine Methode check(String param) die in den Kind-Klassen unverändert verwendet wird.
Für meine Testfälle will ich jetzt die Methode check aus A überschreiben und eine Klasse mit der Stub-Methode check(String param) erstellen. Ich möchte dies über Generics lösen, da ich dann nicht X Klassen zu den X Kind-Klassen von A dazu brauche (sondern nur eine).

Mein Problem ist, wenn ich die Klasse mit "public class X <T extends A>" erstelle dann kann ich jedoch nicht auf die Methode check zugreifen. Sollte dies das nicht normalerweise können? Habt ihr eine Idee oder einen Link wie ich das effektiv lösen könnte?

Cu
Alex
 

Marco13

Top Contributor
Hmnee... wenn ich das jetzt richtig verstanden habe, sollte das ja auf sowas rauslaufen wie
Code:
class A { void check(){} }
class B { void check(){} } // Überschreibt check

// Sowas geht dann nicht
class First [b]extends <T extends A>[/b] { } // Kann von A oder von B (extends A) erben

Wär' eigentlich ganz interessant :reflect: (In C++ geht das... Dass es in Java nicht geht ist ein Zeichen dafür, dass es da das Typsystem irgendwie übel raushauen würde, aber das müßte man mal näher nachvollziehen).

Abhilfe wäre erstmal, den Inhalt der check-Methode von einem "Checker"-Objekt :cool: ausführen zu lassen, und für den Testfall dann eben dort einen "TestChecker" reinzupacken, der die spezielle, für den Testfall benötigte Aktion durchführt, aber man müßte sich genau überlegen, wie man das machen könnte, damit man nicht NUR für den Test die API irgendwie umbiegt. Vielleicht gibt's auch eine Elegantere Lösung. (Wieder einmal: Komposition ist oft besser als Vererbung...)
 

Landei

Top Contributor
Mein Problem ist, wenn ich die Klasse mit "public class X <T extends A>" erstelle dann kann ich jedoch nicht auf die Methode check zugreifen. Sollte dies das nicht normalerweise können?

Ich glaube hier liegt ein Verständnisproblem vor: Wenn du z.B. List<String> schreibst, kannst du nicht plötzlich in List auf Methoden von String zugreifen. Anders ausgedrückt: Generics sind keine Form der Vererbung und können dir bei deinem Problem (so wie ich es verstanden habe) deshalb nicht weiterhelfen.

Wenn du die Klassen nicht doppelt haben willst, muss sich die Methode check selbst unterschiedlich verhalten. Dafür gibt es mehrere Möglichkeiten. Am unschönsten wäre ein Debug-Schalter:

Java:
class A {
   public static boolean DEBUG = false;

   public void check(String param) {
       if(DEBUG) {
           System.out.println("debugging!"); 
       } else {
           doTheRealThing();
       } 
   }
}

Eine andere Variante wäre Komposition: Die check-Methode in A delegiert an ein "Checker-Objekt". Das kann entweder an A übergeben werden, oder eleganter mit Dependency Injection oder einem SPI ServiceLoader gesetzt werden:

Java:
interface Checker {
   void check(String param);
}

class A {
   public static Checker checker = null; //muss von "außen" gesetzt werden, evtl. per DI oder SPI

   public void check(String param) {
       checker.check(param);
   }
}

Andere Lösungswege wären AOP oder ein Proxy. Oder man verwendet eine Sprache, deren Typsystem sowas ausdrücken kann (*hüstl* Signatur *hüstl*)
 

WeirdAl

Bekanntes Mitglied
Hi,
ja, sowas in der Art hatte ich vor. Ich bin grad dabei mir Gedanken zu machen wie es elegant anders zu lösen ist. Danke für die schnellen Antworten :)
 
B

bygones

Gast
Java:
interface Checker {
   void check(String param);
}

class A {
   public static Checker checker = null; //muss von "außen" gesetzt werden, evtl. per DI oder SPI

   public void check(String param) {
       checker.check(param);
   }
}
ich hoffe mal dieses [c]public static[/c] ist n Fehler....
 

Landei

Top Contributor
Nicht das Gelbe vom Ei, ich weiß, aber alles was hier bisher vorgeschlagen wurde ist mehr oder weniger eine Krücke. Da ich z.Z. auf dem Guice-Trip bin, hier die DI-Variante:

Java:
interface Checker {
   void check(String param);
}
 
//Braucht Google Guice
class A {
   private Checker checker;
    
   @Inject
   class A(Checker checker) {
       this.checker = checker;
   }

   public void check(String param) {
       checker.check(param);
   }
}
 
B

bygones

Gast
es wäre nur unsinnig von DI zu reden und dann die Variable die injected werden soll als public static zu definieren...
 

Landei

Top Contributor
Ich habe von DI als eine von mehreren Möglichkeiten gesprochen. Eine andere Variante wäre halt, die Variable einfach "von außen" zu setzen. Wie gesagt nicht schön, aber auch eine Variante. Dass man injizierte Variablen normalerweise nicht public macht, weiß ich auch - siehe mein Guice-Beispiel.

Ich habe übrigens gelernt, "häßliche" Lösungen nicht sofort zu verwerfen, manchmal kann sich daraus noch etwas vernünftiges entwickeln. Voraussetzung dafür ist natürlich, dass man weiß, was "häßlich" ist, und wo jeweils die Probleme liegen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Klassen Mehoden einer Klasse erweitern Allgemeine Java-Themen 5
D Erste Schritte Liste erweitern Allgemeine Java-Themen 11
Bluedaishi Zeile um zeichen erweitern Allgemeine Java-Themen 9
J Application mit PLugin erweitern Allgemeine Java-Themen 2
A Java Kenntnisse erweitern Allgemeine Java-Themen 5
E Java Programm mit Clients erweitern - Möglichkeiten? Allgemeine Java-Themen 2
B Hilfe!! spiel um Funktion des Selektierens erweitern (mit ASCII-Tabelle) Allgemeine Java-Themen 3
J build.xml erweitern Allgemeine Java-Themen 2
B Polibios Array erweitern Allgemeine Java-Themen 1
M XML-Datei "erweitern" mit Java Allgemeine Java-Themen 2
K Java Standardbib/reservierte Wörter erweitern Allgemeine Java-Themen 1
H Reg Exp Ausdruck erweitern Allgemeine Java-Themen 2
M HashMaps: Wert erweitern Allgemeine Java-Themen 3
Rudolf JUnit4-Testklasse erweitern ohne zu vererben Allgemeine Java-Themen 6
J Input/Output Jar-Datei zur Laufzeit erweitern Allgemeine Java-Themen 13
nrg URL erweitern Allgemeine Java-Themen 2
T Klassen Fabrik (Factory) zur Laufzeit erweitern Allgemeine Java-Themen 5
GUI-Programmer JDK erweitern Allgemeine Java-Themen 42
S Ant erweitern..? Allgemeine Java-Themen 4
I Pattern zum Erweitern existierender Objekte Allgemeine Java-Themen 4
C Kontextmenü erweitern und mit Java Anwendung verknüfen. Allgemeine Java-Themen 3
M eigene Klasse durch Composition mit java.io.File erweitern Allgemeine Java-Themen 3
D Enums subclassen / erweitern? Allgemeine Java-Themen 2
J Können Programme sich selbst erweitern? Allgemeine Java-Themen 6
dunhillone Mittels Annotations Methoden "erweitern"? Allgemeine Java-Themen 11
S Objekt in Datei erweitern Allgemeine Java-Themen 16
DamienX Erweitern von Runnable Allgemeine Java-Themen 3
P Funktion vorhanden - wie auf Transitivität erweitern? Allgemeine Java-Themen 6
N Classpath mit ClassLoader künstlich erweitern Allgemeine Java-Themen 2
M ArrayList erweitern - generics Allgemeine Java-Themen 4
P JComponenten (Button, JSlider, usw) erweitern Allgemeine Java-Themen 12
G Vector erweitern Allgemeine Java-Themen 4
G Tabellenzeilen erweitern Allgemeine Java-Themen 9
B desktop auf monitor erweitern Allgemeine Java-Themen 22
N Graphische Oberfläche dynamisch erweitern möglich? Allgemeine Java-Themen 4
D Programm um Klassen erweitern ohne neukompilieren? Allgemeine Java-Themen 5
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
T JNA, Aufruf der Funktionen einer dll Allgemeine Java-Themen 5
I Vom Monolith zu Services in einer Webseite Allgemeine Java-Themen 1
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Wie kann ich den Wert aus einer If abfrage ausgeben Allgemeine Java-Themen 23
S HTML einer Webseite 1:1 so bekommen wie es auch der Browser anzeigt? Allgemeine Java-Themen 14
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
J (Geplante) Änderungen an einer Datei vorübergehend speichern und anwenden? Allgemeine Java-Themen 12
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
_user_q Obfuscate einer .jar-Datei mit ProGuard? Allgemeine Java-Themen 2
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
Zeppi NullPointerException in einer if-Abfrage Allgemeine Java-Themen 6
D Abbruch einer ViewScoped Bean in Arbeit Allgemeine Java-Themen 2
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
Lukas2904 Wie kann man cps (ClicksPerSecond) in einer GUI anzeigen lassen? Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
N BlueJ Implementation einer Analoguhr Allgemeine Java-Themen 0
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
N Speicherort einer Datei im Explorer ändern Allgemeine Java-Themen 8
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
J Zerlegen einer Zahl Allgemeine Java-Themen 6
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
MiMa Person in einer Arraylist hinzugügen mit Prüfung ? Allgemeine Java-Themen 6
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
MiMa Prüfziffer einer EAN Nummer berechnen Allgemeine Java-Themen 4
MiMa Erstellungsdatum einer Datei Allgemeine Java-Themen 10
Drachenbauer Wie kann ich einer existierenden Enum von außerhalb veränderte Werte zuweisen? Allgemeine Java-Themen 5
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
M Hilfe bei einer Java Programmieraufgabe! Ab morgen Montag um 08:00 Uhr Allgemeine Java-Themen 5
J Algorithmen Analyse einer Schleife Allgemeine Java-Themen 6
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
A Mithilfe von einer Nummer einen Namen finden n-Beziehung Allgemeine Java-Themen 8
Scream_ilias Auf einer Website die anmeldedaten eingeben Allgemeine Java-Themen 9
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
I Lohnt sich heutzutage der Aufwand einer Portierung für MacOS Allgemeine Java-Themen 8
J Suchen von einer Scannereingabe in einem HashSet Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben