incompatibel return type bei vererbung

Status
Nicht offen für weitere Antworten.

guni

Bekanntes Mitglied
Hallo, ich habe eine Klasse Database, die mir eine Verbindung zu einer db herstellt:
(der Einfachkeit halber bild ich sie hier nicht vollständig ab)

Java:
public class Database {
	private static Database INSTANCE;
	public Connection sql;
	public Statement stmnt;

	public static Database getInstance() throws Exception {
		if (INSTANCE == null) {
			INSTANCE = new Database();
		}
		return INSTANCE;
	}
	protected Database() throws ClassNotFoundException, SQLException {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		sql = DriverManager.getConnection(dbconnect, user, password);
		stmnt = sql.createStatement();
	}
}

also, Schema ist bekannt, oder?!
hier habe ich ein Klasse, die von Database erbt:
Java:
public class SagDatabase extends Database {
	private static SagDatabase INSTANCE;

	public static SagDatabase getInstance() throws Exception {
		if (INSTANCE == null) {
			INSTANCE = new SagDatabase();
		}
		return INSTANCE;
	}
	
	private SagDatabase() throws Exception {
		super();
	}
	
}
... soweit auch klar, oder?!
jetzt kommt noch eine Klasse, die in meinen Augen gleich aufgebaut ist:

Java:
public class CdbDatabase extends Database {
	private static CdbDatabase INSTANCE;

	public static CdbDatabase getInstance() throws Exception {
		if (INSTANCE == null) {
			INSTANCE = new CdbDatabase();
		}
		return INSTANCE;
	}

	private CdbDatabase() throws Exception {
		super();
	}
}

der kleine Unterschied: die Klasse SAG-Database funktioniert; die Klasse CdbDatabase gibt einen Fehler:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The return type is incompatible with Database.getInstance()

wie kann das sein?!

mfg, guni
 
S

SlaterB

Gast
statische Methoden werden nicht vererbt,
bei mir ist auch kein Fehler zu sehen,
nimmt man das static raus, so klappt die Vererbung bei mir ohne Fehler

ganz schön mysteriös

Screenshots, alles in eine Datei schreiben?

Java:
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;


public class Test
{


    public static void main(String[] args)
        throws Exception
    {
    }
}


class Database
{
    private static Database INSTANCE;
    public Connection sql;
    public Statement stmnt;

    public Database getInstance()
        throws Exception
    {
        if (INSTANCE == null)
        {
            INSTANCE = new Database();
        }
        return INSTANCE;
    }

    protected Database()
        throws ClassNotFoundException, SQLException
    {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        // sql = DriverManager.getConnection(dbconnect, user, password);
        stmnt = sql.createStatement();
    }
}


class SagDatabase
    extends Database
{
    private static SagDatabase INSTANCE;

    public SagDatabase getInstance()
        throws Exception
    {
        if (INSTANCE == null)
        {
            INSTANCE = new SagDatabase();
        }
        return INSTANCE;
    }

    private SagDatabase()
        throws Exception
    {
        super();
    }

}


class CdbDatabase
    extends Database
{
    private static CdbDatabase INSTANCE;

    public CdbDatabase getInstance()
        throws Exception
    {
        if (INSTANCE == null)
        {
            INSTANCE = new CdbDatabase();
        }
        return INSTANCE;
    }

    private CdbDatabase()
        throws Exception
    {
        super();
    }
}
 

guni

Bekanntes Mitglied
Was meinst du mit Screenshot?
Hier ist einer:


Und was soll es bringen, wenn ich alles in eine Datei schreib?!
mfg, guni
 

guni

Bekanntes Mitglied
hmm ...
was heißt das jetzt für mich?
Warum funktioniert 'SagDatabase' und 'CdbDatabase' nicht?!
Sie sind doch genau gleich aufgebaut?!
Instance wird ja ausserdem von einer statischen Methode aufgerufen ... insofern dürfte innerhalb von der Methode ja auch keine Vererbungsproblematik auftreten! ...

lg, guni
 
S

SlaterB

Gast
da ist noch ein zweites rotes X weiter unten, steht da was interessantes?
funktioniert es, wenn in der Oberklasse keine getInstance()-Methode vorhanden ist?

einen Sinn sehe ich aber immer noch nicht in einer derartigen Fehlermeldung,
vielleicht hilft Project -> Clean

> Und was soll es bringen, wenn ich alles in eine Datei schreib?!

sämtlichen anderen Code, Imports, gleichnamige Klassen, usw. ignorieren
 

guni

Bekanntes Mitglied
nein ... das 2. 'x' ist nicht relevant; hab nur eine Klammer falsch gesetzt; mein Fehler taucht aber unabhängig davon auf.

die getInstance-Methode möchte ich aus der Parent-Class eigentlich nicht entfernen; schließlich soll man auch von dieser Klasse ein Objekt erzeugen können ...

ein 'clean' werde ich gleich mal ausprobieren ...
 

guni

Bekanntes Mitglied
hmm ... das 'clean' hat nichts gebracht :-(
irgendeine Ahnung woran es sonst noch liegen könnte?!
 
M

maki

Gast
hmm ... das 'clean' hat nichts gebracht :-(
irgendeine Ahnung woran es sonst noch liegen könnte?!
Der Code ist falsch, anscheinend werden statische Methoden doch vererbt, aber beim überladen darf ebem der return type nicht geändert werden.

Singletons & Vererbung funktionieren nicht in Java, hat mich noch nie gestört, ist imho eh daneben wenn man von Singletons erben will.
 

guni

Bekanntes Mitglied
hmm ... wenn du oben schaust hab ich aber eine Klasse SagDatabase.
In dieser Klasse überschreib ich ganz genauso meine getInstance aus dem Database-Singleton. Trotzdem gehts. Es muss also an irgend was anderem liegen -> ???:L

lg, guni
 
S

SlaterB

Gast
der Code läuft bei mir und damit anscheinend bei der Allgemeinheit korrekt,
insofern braucht man über ihn nicht weiter nachzudenken

die Java-Version, die Entwicklungsumgebung, das Betriebssystem usw. könnten interessanter sein,
aber mir brächte das auch nix, einen solchen Fehler habe ich noch nicht gesehen
 
M

maki

Gast
hmm ... wenn du oben schaust hab ich aber eine Klasse SagDatabase.
In dieser Klasse überschreib ich ganz genauso meine getInstance aus dem Database-Singleton. Trotzdem gehts. Es muss also an irgend was anderem liegen -> ???:L

lg, guni
Das liegt eher am inkrementellen Kompilieren unter Eclipse, SlaterBs Code mit static bringt den Fehler bei jedem abgeleiteten SIngleton.

der Code läuft bei mir und damit anscheinend bei der Allgemeinheit korrekt,
insofern braucht man über ihn nicht weiter nachzudenken
Wenn du das static wieder reinnimmst, nicht ;)
 
S

SlaterB

Gast
bei dir kommt es also auch zum Compilerfehler?
nun gut, dann erkläre du das, bei mir gehts

ein Fehler wäre natürlich, wenn es in der Oberklasse nicht statisch ist,
aber in den Subklassen statisch, dann allerdings ein anderer als angegeben
(This static method cannot hide the instance method from Database)
 
M

maki

Gast
bei dir kommt es also auch zum Compilerfehler?
nun gut, dann erkläre du das, bei mir gehts
Hmmm... gestern Abend bei mir zuhause hat es die gleichen Fehler wie beim TS angezeigt, aber bei jeder Subklasse... jetzt nicht mehr... muss mal zuhause nachsehen was ich da anders hatte.
 

guni

Bekanntes Mitglied
ok ... vielleicht muss ich einfach mein konzept überdenken ... mich ärgert nur, dass es bei der einen Klasse geht und bei der anderen nicht ...
aber gut: überdenken wir:
* ich habe eine klasse Database, die in verschiedenen Objekten benötigt wird. da ich sie zur Laufzeit allerdings nur ein einziges Mal initialisieren möchte und beim Prgrammieren nicht dauernd überlegen will, ob ich sie woanders schon initialisiert hab, hab ich mich hier für einen Singleton unterschieden.
* ich hab ein paar konkretere Klassen, die im Prinzip das gleiche wie Database machen (Vererbung!). sie unterscheiden sich eigentlich eher dadurch, dass in konkreteren Fällen schon mehr Verbindungseinstellungen bekannt sind -> man braucht also weniger Parameter übergeben. Allerdings sollen auch diese Klassen wieder nur einmalig initialisiert werden -> Kombination aus Vererbung und Singleton.
-- ich will hier keinen Thread darüber starten, ob Singleton philosophisch gesehen schön ist (gibt es glaub ich schon *gg*) ... habt ihr irgendeine andere Idee, das Ganze zu konzeptionieren?!

lg, guni
 
M

maki

Gast
Mit einer abstrakten Factory wie hier zB: Core J2EE Patterns - Data Access Object

Was mich an deinem Code etwas wundert ist, dass du "angeblich" 3 (!) Datenbanken hast, die du lesen möchtest, alle Oracle, mit demselben User & Password... alle dasselbe Schema??? Ja -> 1 DB, nicht 3..
 
S

SlaterB

Gast
nenne die Methoden doch unterschiedlich und finde eine zentrale Klasse mit Methoden wie
getInstanceDatabase()
getInstanceSagDatabase()
usw

Vererbung gibts nicht, also muss du eh jede Methode direkt eintippen,
vielleicht auch ne Factory mit
getInstance(Klasse/-nname)
die anhand der Klasse das richtige intern verwaltete Objekt zurückgibt
 

guni

Bekanntes Mitglied
@maki.
der code den du oben siehst ist stark vereinfacht: natürlich verbinden nicht alle 3 klassen mit selber dbconnect, user, pw zur datenbank.
hab die 3 attribute dbconnect, user, pw protected angelegt.
in der Database hab ich dann genaugenommen im Konstruktor noch einen Aufruf auf eine OverrideSettings, die in den Kindklassen zu redefinition der Verbindungseinstellungen überschrieben werden kann.
Die einzelnen Klassen unterscheiden sich dann einfach durch die Art und Weise wie die Verbindungseinstellungen ermittelt werden.

@SlaterB: hmm ... die statischen getInstance-Methoden unterschiedlich nennen: Einfach aber wirksam. Tolle Idee ... manchmal sieht man vor lauter Bäumen den Wald nicht mehr ;-)
 
M

maki

Gast
Hier wie versprochen der Code der bei mir zuhause die Fehler (incompatible return type) bei allen Unterklassen zeigt:
Java:
package de.test;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
 
 
public class Database
{
    private static Database INSTANCE;
    public Connection sql;
    public Statement stmnt;
 
    public static Database getInstance()
        throws Exception
    {
        if (INSTANCE == null)
        {
            INSTANCE = new Database();
        }
        return INSTANCE;
    }
 
    protected Database()
        throws ClassNotFoundException, SQLException
    {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        // sql = DriverManager.getConnection(dbconnect, user, password);
        stmnt = sql.createStatement();
    }
}
 
 
class SagDatabase
    extends Database
{
    private static SagDatabase INSTANCE;
 
    public static SagDatabase getInstance()
        throws Exception
    {
        if (INSTANCE == null)
        {
            INSTANCE = new SagDatabase();
        }
        return INSTANCE;
    }
 
    private SagDatabase()
        throws Exception
    {
        super();
    }
 
}
 
 
class CdbDatabase
    extends Database
{
    private static CdbDatabase INSTANCE;
 
    public static CdbDatabase getInstance()
        throws Exception
    {
        if (INSTANCE == null)
        {
            INSTANCE = new CdbDatabase();
        }
        return INSTANCE;
    }
 
    private CdbDatabase()
        throws Exception
    {
        super();
    }
}
k.A. warum das so ist...

Nachtrag: Derselbe Code liefert diese Fehler wenn es sich um ein Maven2 Project handelt, bei einem normalen Eclipse Java Projekt aber nciht.
Könnte es an den unterschiedlichen Compilern liegen???
:bahnhof:???:L
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiMa Java Doc mehrere Return Parameter Java Basics - Anfänger-Themen 11
A Return in While Schleife Java Basics - Anfänger-Themen 6
J Rekursive Funktion und return statement Java Basics - Anfänger-Themen 3
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
M Warum return die Methode den Wert nicht Java Basics - Anfänger-Themen 5
S Methoden Return Rückgabewert wird nicht übergeben Java Basics - Anfänger-Themen 8
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
I Return Array Java Basics - Anfänger-Themen 4
Q return Ausgabe Java Basics - Anfänger-Themen 4
javapingu Variablenwerte ändern ohne return Statement? Java Basics - Anfänger-Themen 7
C Ausgabe boolean return ((n==9)||(n==0)); Java Basics - Anfänger-Themen 13
G return 1 + methode Java Basics - Anfänger-Themen 4
H Methode mit Array als Rückgabe This method must return a result of Type int[] Java Basics - Anfänger-Themen 2
JD_1998 Hilfsmethode if return funktioniert nicht Java Basics - Anfänger-Themen 2
J Missing Return Statement Java Basics - Anfänger-Themen 11
T Return einer anderen Methode herausfinden Java Basics - Anfänger-Themen 9
C ArrayList mit return zurückgeben Java Basics - Anfänger-Themen 13
M kann man return in nur einer Methode einsetzen? Java Basics - Anfänger-Themen 7
V return String[] führt zu [Ljava.lang.String;@50675690 Java Basics - Anfänger-Themen 7
K Return in Schleife Java Basics - Anfänger-Themen 4
B Statische Methode return funktioniert nicht. Java Basics - Anfänger-Themen 19
S Missing return Java Basics - Anfänger-Themen 4
das_leon return message Java Basics - Anfänger-Themen 2
C return kann nicht auf variable zugreifen Java Basics - Anfänger-Themen 26
N Ausführung gibt keinen Fehler an, Return wird aber nicht ausgegeben Java Basics - Anfänger-Themen 22
R return: cannot find symbol Java Basics - Anfänger-Themen 2
R Ratespiel mit Return und einer Eingabe Java Basics - Anfänger-Themen 1
Z Return in While-Schleife Java Basics - Anfänger-Themen 7
N Frage zu this, super und return Java Basics - Anfänger-Themen 13
K ArrayList ausgeben mit return Java Basics - Anfänger-Themen 6
M Return statement Java Basics - Anfänger-Themen 4
J-Gallus Ein Getter bekommt eine anderen Type als er Return soll Java Basics - Anfänger-Themen 9
J Variablen Komsiche System.in.read() return-value? Java Basics - Anfänger-Themen 3
M Abbrechen Methode ohne return Java Basics - Anfänger-Themen 3
M Methoden Datei einlesen und als return übergeben. Java Basics - Anfänger-Themen 8
L OOP Return Java Basics - Anfänger-Themen 10
L Erste Schritte Frage zu 'return' Java Basics - Anfänger-Themen 4
J Methoden Rekursive Return Methode Java Basics - Anfänger-Themen 2
W Return statement in Methode nur bei if-clause Java Basics - Anfänger-Themen 3
D Methoden Return-Wert wird nicht ausgegeben Java Basics - Anfänger-Themen 3
F Return-Anweisung Java Basics - Anfänger-Themen 2
E Erste Schritte <? super Unterklasse> Return-Typ darf nicht vom Wildcard-Typ sein Java Basics - Anfänger-Themen 5
B OOP Methode mit Array mit return verlassen Java Basics - Anfänger-Themen 8
J Grundsätzliche Frage zu return Types in Methoden Java Basics - Anfänger-Themen 6
G return-wert für eine Methode Java Basics - Anfänger-Themen 1
B Methoden Probleme mit for Schleife und return Java Basics - Anfänger-Themen 5
Q Tastatureingabe direkt nach Eingabe (ohne zwischenzeitliches "Return" o.Ä ) weiterverwenden Java Basics - Anfänger-Themen 1
B Variablen Problem mit return String[] Java Basics - Anfänger-Themen 4
O Per return Run Methode beenden Java Basics - Anfänger-Themen 3
M Arrays als return Value? Java Basics - Anfänger-Themen 2
C Return statement Java Basics - Anfänger-Themen 10
T Boolean Missing return Statement?! Java Basics - Anfänger-Themen 2
Z Methoden return nullprüfung Java Basics - Anfänger-Themen 7
O Java return in Schleife Java Basics - Anfänger-Themen 4
K Was macht hier genau return? Java Basics - Anfänger-Themen 2
G Methoden Was bedeutet return in einer Methode Java Basics - Anfänger-Themen 5
Y Warum void statt Datentyp + return Java Basics - Anfänger-Themen 4
K Variablen RETURN in Case-Switch / This method must return a result of type Item Java Basics - Anfänger-Themen 4
K Erste Schritte "return" Problem bei Rekursion Java Basics - Anfänger-Themen 8
R If Verschachtelung und return; Java Basics - Anfänger-Themen 4
M Frage zum return; Befehl Java Basics - Anfänger-Themen 1
S try-catch - Variablen werden nicht an return übergeben Java Basics - Anfänger-Themen 3
C Einige Anfängerfragen (Return-Wert, Exception...) Java Basics - Anfänger-Themen 11
S Methoden Return Java Basics - Anfänger-Themen 8
T return-Wert verwenden? Java Basics - Anfänger-Themen 12
T Return eines Int-Werts? Java Basics - Anfänger-Themen 3
W return-Anweisung gibt nichts aus Java Basics - Anfänger-Themen 5
R Return in If Java Basics - Anfänger-Themen 10
S Methoden Return Anweisung beendet Methode nicht, stattdessen wird diese zweimal durchlaufen Java Basics - Anfänger-Themen 3
G array return methode Java Basics - Anfänger-Themen 10
L return wird nicht erkannt? Java Basics - Anfänger-Themen 3
J Regex mit Return Java Basics - Anfänger-Themen 3
M Variablen return-array klonen Java Basics - Anfänger-Themen 3
A Methode mit Array als Param --> return Array --> Fehler Java Basics - Anfänger-Themen 3
S Zeichen einlesen ohne Return? Java Basics - Anfänger-Themen 19
P Compiler-Fehler Boolean: Missing Return Statement Java Basics - Anfänger-Themen 4
S probleme mit der return anweisung Java Basics - Anfänger-Themen 20
E Warum wird Methode nicht durch return-Befehl beendet? Java Basics - Anfänger-Themen 3
V Erste Schritte Return ohne Argument Java Basics - Anfänger-Themen 6
I Methoden Missing return statement; Intervallschachtellung Java Basics - Anfänger-Themen 12
S Frage zu Vererbung und return. Java Basics - Anfänger-Themen 4
R return (mehrere floats) Java Basics - Anfänger-Themen 11
E Return String Java Basics - Anfänger-Themen 10
P Methoden Methode ohne return abbrechen? Java Basics - Anfänger-Themen 12
I Return Befehl in Methode Java Basics - Anfänger-Themen 13
M Problem mit boolean. Return nicht erkannt Java Basics - Anfänger-Themen 10
P Return aus For-Schleife Java Basics - Anfänger-Themen 19
S return in GUI ? Java Basics - Anfänger-Themen 12
M This method must return a result of type int Java Basics - Anfänger-Themen 13
F Erste Schritte return (char)toUnsignedInt(value) Java Basics - Anfänger-Themen 2
A Falscher Return-Wert Java Basics - Anfänger-Themen 2
M missing return statement?! Java Basics - Anfänger-Themen 4
L Return Fragen Java Basics - Anfänger-Themen 4
R Nach return() der aufgerufenen Methode wird aufrufende Methode nicht weiter ausgeführt Java Basics - Anfänger-Themen 14
I Null als return obwohl datensatz existiert Java Basics - Anfänger-Themen 12
S this method must return a result of type double Java Basics - Anfänger-Themen 2
V Problem mit return Java Basics - Anfänger-Themen 7
K Return Problem Java Basics - Anfänger-Themen 3
M Fragen zu Methoden (void/return), Übergabe von Parametern Java Basics - Anfänger-Themen 3
M Objekto.Programm. Return-Befehl Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben