Was passiert, wenn eine konkrete Klasse von generische Klasse erbt?

babuschka

Top Contributor
Hallo Community,
was passiert denn eigentlich wen eine konkrete Klasse von einem generischen Klasse erbt? Da ensteht dann Fehler, wenn ich mit super auf den Konstruktor der Basisklasse zugreifen will. An was kann das liegen?

Beispiel:

Java:
package generic1;

public class GenericSub extends GenericBasis {

    String adresse;
    
    GenericSub( T name, int alter, String adresse){    <--- Fehlermeldung Cannot find Class T
    super(name, alter);                                         <--- Cannot find Symbol Construktor
    this.adresse=adresse;
    }

    void drucke(){
        System.out.println("Generic Subklasse");
        System.out.println("Name: "+name);
        System.out.println("Alter: "+alter);
        System.out.println("Adresse: ");
    }
}


package generic1;

public class GenericBasis<T> {
    T name;
    int alter;
    
    GenericBasis(T n, int a){
    this.name=n;
    this.alter=a;
    }
    
    void drucke(){
        System.out.println("Generic Basisklasse");
        System.out.println("Name: "+name);
        System.out.println("Alter: "+alter);
    }

}
 
Ohne Deklaration ist Type T immer das oberste Typeobjekt Object

Java:
GenericSub( Object name, int alter, String adresse)

Also heißt es, wenn <T> bei GenericSub fehlt dann muss ich anstatt T -> Object nehmen damit die Variablen dann vom Typ T ist? Richtig oder Falsch? Stimmt es dann so? Die Variablen name und alter sind vom Typ T und gehören zur der Klasse GenericBasis. Es entsteht trotzdem Fehler, wenn ich die Klasse wie bei der ersten Beispiel deklariere.


1. Beispiel

Java:
public class GenericSub extends GenericBasis<T>  {

    String adresse;
    
    GenericSub( Object name, Object alter, String adresse){
    super(name, alter);
    this.adresse=adresse;
    }


2 Beispiel:

Java:
public class GenericSub extends GenericBasis<T>  {

    String adresse;
    
    GenericSub(T name,T alter, String adresse){
    super(name, alter);
    this.adresse=adresse;
    }
 
Zuletzt bearbeitet von einem Moderator:
Du kannst die Klasse entweder generisch haben, oder nicht generisch. Wenn du sie generisch machst, gibt es T, wenn nicht, dann gibt es kein T.
Dann musst du selbst entscheiden , welchen Typ T hat, das geht z.B. mit
Java:
public class GenericSub extends GenericBasis<String>
Wenn du einfach nur [c]extends GenericBasis[/c] schreibst, sollte der Compiler eigentlich warnen, und es ist gleichbedeutend mit [c]extends GenericBasis<Object>[/c].

Edit: Deine letzte Antwort hatte ich noch nicht gelesen.
Java:
public class GenericSub extends GenericBasis<T>
ist aber keine korrekte Syntax. Wenn du das generisch machen willst, musst du das auch in der Unterklasse nochmal deklarieren:
Java:
public class GenericSub<T> extends GenericBasis<T>
 
Zuletzt bearbeitet:
Du kannst die Klasse entweder generisch haben, oder nicht generisch. Wenn du sie generisch machst, gibt es T, wenn nicht, dann gibt es kein T.
Dann musst du selbst entscheiden , welchen Typ T hat, das geht z.B. mit
Java:
public class GenericSub extends GenericBasis<String>
Wenn du einfach nur [c]extends GenericBasis[/c] schreibst, sollte der Compiler eigentlich warnen, und es ist gleichbedeutend mit [c]extends GenericBasis<Object>[/c].

ja aber ich meine ja meine Klasse GenericSub ist keine generische Klasse ist eine normale Klasse erbt aber von einer generischen Klasse ist das überhaupt möglich? Oder muss die Klasse GenericSub genauso generisch sein, damit die von der GenericBasis erben kann?

Ich will einfach wissen, wie die Deklaration aussieht, wenn eine normale Klasse also nicht generische Klasse von einer generischen Klasse erbt. Und wie sieht es aus wenn eine generische Klasse von einer generischen Klasse erbt? Die Deklarationen sind für mich wichtig.
 
Also nochmal: Ein Objekt vom Typ GenericSub ist eben auch vom Typ GenericBasis. Und daher muss der Compiler eben wissen, was bei diesem Objekt eben "T" sein soll. Und da hast du eben die zwei Möglichkeiten: explizit angeben (extends Basis<...>) - dann ist die Unterklasse nicht mehr generisch. Oder es soll immer noch generisch sein: Sub<T> extends Basis<T>
 
Java:
public class GenericSub extends GenericBasis<T>
ist aber keine korrekte Syntax. Wenn du das generisch machen willst, musst du das auch in der Unterklasse nochmal deklarieren:
Java:
public class GenericSub<T> extends GenericBasis<T>
[/QUOTE]

ich will dass eine konkrete Klasse von einer generischen Klasse erbt. Sieht das nicht so aus?


Java:
public class GenericSub extends GenericBasis<T>


Gehört hier die erste <T> nicht zu GenericSub? Was sagt uns das?
Java:
public class GenericSub<T> extends GenericBasis<T>
 
Also nochmal: Ein Objekt vom Typ GenericSub ist eben auch vom Typ GenericBasis. Und daher muss der Compiler eben wissen, was bei diesem Objekt eben "T" sein soll. Und da hast du eben die zwei Möglichkeiten: explizit angeben (extends Basis<...>) - dann ist die Unterklasse nicht mehr generisch. Oder es soll immer noch generisch sein: Sub<T> extends Basis<T>

ne ne 😀 also es soll konkret bleiben. Also wenn eine Konkrete KLasse von einer generischen Klasse erbt, muss man dann anstatt <T> <Object> nehmen, damit auch die Unterklasse konkret bleibt? Andersrum wird es auch zu generischen Klasse? Ich hoffe diesmal hab ichs verstanden Sorry ???:L

uns so sieht es dann aus?

Java:
package generic1;

public class GenericSub extends GenericBasis<Object>  {

    String adresse;
    
    GenericSub( Object name, int alter, String adresse){
    super(name, alter);
    this.adresse=adresse;
    }

    void drucke(){
        System.out.println("Generic Subklasse");
        System.out.println("Name: "+name);
        System.out.println("Alter: "+alter);
        System.out.println("Adresse: ");
    }
}
 
[c]public class GenericSub<T> extends GenericBasis<T>[/c]
In diesem Fall kannst du jeder Instanz von GenericSub einen anderen Typenparameter geben, die Klasse ist wieder generisch. Das erste <T> sagt ich habe einen Typ namens T deklariert, das zweite <T> nutzt diesen definierten Typ T.
Daher ist das zweite ohne das erste sinnlos und auch nicht möglich. Variablen kann man ja auch nicht ohne Deklaration nutzen.

[c]public class GenericSub extends GenericBasis<String>[/c]
Jede Instanz von GenericSub ist eine Instanz von GenericBasis mit dem Typenparameter String.

[c]public class GenericSub extends GenericBasis[/c]
Jede Instanz von GenericSub ist eine Instanz von GenericBasis mit dem (nicht explizit angegebenen) Typenparameter Object.
 
[c]public class GenericSub<T> extends GenericBasis<T>[/c]
In diesem Fall kannst du jeder Instanz von GenericSub einen anderen Typenparameter geben, die Klasse ist wieder generisch. Das erste <T> sagt ich habe einen Typ namens T deklariert, das zweite <T> nutzt diesen definierten Typ T.
Daher ist das zweite ohne das erste sinnlos und auch nicht möglich. Variablen kann man ja auch nicht ohne Deklaration nutzen.

[c]public class GenericSub extends GenericBasis<String>[/c]
Jede Instanz von GenericSub ist eine Instanz von GenericBasis mit dem Typenparameter String.

[c]public class GenericSub extends GenericBasis[/c]
Jede Instanz von GenericSub ist eine Instanz von GenericBasis mit dem (nicht explizit angegebenen) Typenparameter Object.

kann ich dadurch nicht sehen, dass eine generische Klasse von einer generischen Klasse erbt? Durch 2x <T> weis ich ja dass beide Klassen generisch ist oder?

Diese beipsiel

[c]public class GenericSub<T> extends GenericBasis<T>[/c]
 
Damit könntest du beim Instanzieren wieder angeben welchen Typ GenericSub haben soll [c]new GenericSub<String>()[/c]
Lasse ich beim Instanzieren den Typ weg ist dieser wieder implizit Object.
 

Zurück
Oben