Collections Generics: Typ wird nicht erkannt

Javinner

Top Contributor
Hallo an alle,

habe folgendes Problem: Kann ein Integer einem Integer nicht zuweisen.
Warum ist es so? Die Konsolenausgabe bestätigt doch, dass die beiden Taschen der
Person eine Variable von Typ Integer speichern, also auch von Typ Integer sind?!
Stehe ziemlich auf dem Schlauch..


Java:
public class JIAEI_Generics
{

    public static void main(String[] args)
    {
        Person person = new Person();
        Pocket<Integer> pocketA = new Pocket<>(20);
        Pocket<Integer> pocketB = new Pocket<>(2);
        person.setLeftPocket(pocketA);
        person.setRightPocket(pocketB);
        System.out.println("Links: " + person.getLeftPocket().getValue().getClass()); 
        System.out.println("Rechts: " + person.getRightPocket().getValue().getClass());
        /** Konsolenausgabe */
        Links: class java.lang.Integer
        Rechts: class java.lang.Integer

        int links = person.getLeftPocket().getValue(); //Object cannot be converted to int
        int rechts = person.getRightPocket().getValue(); //Object cannot be converted to int
    }

}
Java:
public class Person
{

    private String name;
    private Pocket leftPocket;
    private Pocket rightPocket;

    public String getName()
    {
        return name;
    }

    public Pocket getLeftPocket()
    {
        return leftPocket;
    }

    public Pocket getRightPocket()
    {
        return rightPocket;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public void setLeftPocket(Pocket leftPocket)
    {
        this.leftPocket = leftPocket;
    }

    public void setRightPocket(Pocket rightPocket)
    {
        this.rightPocket = rightPocket;
    }

}
Java:
public class Pocket<T>
{

    private T value;

    public Pocket()
    {
    }

    protected Pocket(T value)
    {
        this.value = value;
    }

    public T getValue()
    {
        return value;
    }

    public void setValue(T value)
    {
        this.value = value;
    }

    protected boolean isEmpty()
    {
        return this.value == null;
    }

    protected void empty()
    {
        this.value = null;
    }

}

edit: wenn ich es nach Int caste, dann geht es. Jedoch dachte ich, dass hier Integer automatisch mitübernommen wird. Wo denke ich falsch?

int links = (int) person.getLeftPocket().getValue();
int rechts = (int) person.getRightPocket().getValue();
 

Robat

Top Contributor
Problem ist dass du bei den beiden Pocket-Objekten in der Personen-Klasse keine Generics angegeben hast.
Wenn du dort die Pockets auch bspw zu einem Pocket<Integer> machst und die Setter dementsprechend abänderst sollte der Fehler verschwinden.
 

Javinner

Top Contributor
@Robat
Danke für Antwort!
Habe folgende Änderungen vorgenommen:
Java:
public class Person
{

    private String name;
    private Pocket<?> leftPocket;
    private Pocket<?> rightPocket;

    public String getName()
    {
        return name;
    }

    public Pocket getLeftPocket()
    {
        return leftPocket;
    }

    public Pocket getRightPocket()
    {
        return rightPocket;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public void setLeftPocket(Pocket<?> leftPocket)
    {
        this.leftPocket = leftPocket;
    }

    public void setRightPocket(Pocket<?> rightPocket)
    {
        this.rightPocket = rightPocket;
    }

}
leider ohne positiven Ergebnis, kann die Werte den Int-Variablen ohne vorher auf int zu casten, nicht zuweisen. Hm..
 

Robat

Top Contributor
Das kann so auch nicht funktionieren.
Mit der Wildcard sagst du dem Compiler, dass da ein Typ kommt den du nicht kennst. Daher kann der Compiler auch nicht garantieren das es in ein Int konvertiert werden kann.
Der einzige Weg der mir spontan einfällt ist explizit anzugeben dass es sich um ein Pocket<Integer> handelt.

Du könntest natürlich auch die Person-Klasse generisch machen (wäre aber meiner Meinung nach aber keine bevorzugte Variante.)
 

Javinner

Top Contributor
Geplant war es so, dass die Person zwei Taschen hat und man diese nach belieben füllen kann. Sprich Integer rein, dann wieder Löschen, mit String füllen usw. Habe schon überlegt, dass man die Klasse Person auch typisieren könnte, so ist es aber nicht der Sinn des ganzen.

Vielen Dank für die Antwort, werde jetzt noch als Nachtlektüre die
Insel lesen (Junge, ist es ein dicker Schnitzel).
Schönen Abend.
 

mrBrown

Super-Moderator
Mitarbeiter
Geplant war es so, dass die Person zwei Taschen hat und man diese nach belieben füllen kann. Sprich Integer rein, dann wieder Löschen, mit String füllen usw. Habe schon überlegt, dass man die Klasse Person auch typisieren könnte, so ist es aber nicht der Sinn des ganzen.
Mit Generics nicht möglich, dafür müsste der Typ Object sein, und man müsste benötigt Typ-Informationen uU händisch mitschleppen
 

Javinner

Top Contributor
Ich verstehe eins nicht:
- wenn ich die Klasse abfrage, dann ist diese vom Typ Integer, bzw, der Rückgabewert der Variablen value, dann muss doch automatisch die Klasse von Typ Integer sein. Ebenso ist es möglich, die Werte wieder zu löschen und ganz neue zu setzen. Warum kann ich aber nicht ohne vorher zu casten, die Werte, welche vom gleichen Typ sind, nicht übertragen, das leuchtet mir nicht ein.
Java:
public class JIAEI_Generics
{

    public static void main(String[] args)
    {
        Person person = new Person();
        Pocket<Integer> pocketInteger = new Pocket<>(20);
        Pocket<String> pocketString = new Pocket<>("String");

        System.out.println("--------------------------------------Füllen der Taschen");
        person.setLeftPocket(pocketInteger);
        person.setRightPocket(pocketString);

        System.out.println("--------------------------------------Abfrage: leere Taschen?");
        System.out.println("Links: " + person.getLeftPocket().isEmpty());
        System.out.println("Rechts: " + person.getRightPocket().isEmpty());

        System.out.println("--------------------------------------Abfrage: Klasse");
        System.out.println("Links: " + person.getLeftPocket().getValue().getClass());
        System.out.println("Rechts: " + person.getRightPocket().getValue().getClass());

        System.out.println("--------------------------------------Taschen leer");
        person.getLeftPocket().empty();
        person.getRightPocket().empty();

        System.out.println("--------------------------------------Abfrage: leere Taschen?");
        System.out.println("Links: " + person.getLeftPocket().isEmpty());
        System.out.println("Rechts: " + person.getRightPocket().isEmpty());

        System.out.println("--------------------------------------Füllen der linken Tasche");
        
        Pocket<Double> pocketDouble = new Pocket<>(123.451);
        person.setLeftPocket(pocketDouble);

        System.out.println("--------------------------------------Abfrage: linke Tasche leer?");
        System.out.println("Links: " + person.getLeftPocket().isEmpty());
        System.out.println("--------------------------------------Abfrage: linke Tasche Klasse");
        System.out.println("Links: " + person.getLeftPocket().getValue().getClass());

    }

}
/** Konsolenausgabe */
run:
--------------------------------------Füllen der Taschen
--------------------------------------Abfrage: leere Taschen?
Links: false
Rechts: false
--------------------------------------Abfrage: Klasse
Links: class java.lang.Integer
Rechts: class java.lang.String
--------------------------------------Taschen leer
--------------------------------------Abfrage: leere Taschen?
Links: true
Rechts: true
--------------------------------------Füllen der linken Tasche
--------------------------------------Abfrage: linke Tasche leer?
Links: false
--------------------------------------Abfrage: linke Tasche Klasse
Links: class java.lang.Double
BUILD SUCCESSFUL (total time: 0 seconds)
 

mrBrown

Super-Moderator
Mitarbeiter
wenn ich die Klasse abfrage, dann ist diese vom Typ Integer, bzw, der Rückgabewert der Variablen value, dann muss doch automatisch die Klasse von Typ Integer sein. Ebenso ist es möglich, die Werte wieder zu löschen und ganz neue zu setzen.
Richtig - zur Laufzeit liegt da ein Integer drin.

Warum kann ich aber nicht ohne vorher zu casten, die Werte, welche vom gleichen Typ sind, nicht übertragen, das leuchtet mir nicht ein.
Das kannst du mit Generics schon, wenn du trotzdem casten musst, machst du wahrscheinlich was falsch.
Kommt in deinem Code aber nicht vor.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
H Generics machen mich verrückt Java Basics - Anfänger-Themen 8
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
MarvinsDepression Datentypen Generics: Erste Berührungen Java Basics - Anfänger-Themen 6
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
Cassy3 Generics - CompareTo Java Basics - Anfänger-Themen 21
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
districon Generics implementieren Java Basics - Anfänger-Themen 2
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Hilfe bei Generics Java Basics - Anfänger-Themen 11
G Generics Compilerfehler Java Basics - Anfänger-Themen 6
G Generics Methoden Java Basics - Anfänger-Themen 7
G Generics Java Basics - Anfänger-Themen 3
L Generics Tripel Java Basics - Anfänger-Themen 26
W Fragen zu Generics Java Basics - Anfänger-Themen 14
S Hilfe. Generics und BiFunctions Java Basics - Anfänger-Themen 10
X Wie Generics richtig benutzen ? Java Basics - Anfänger-Themen 5
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
I Java Generics factory method Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
I Generics und Comparable Java Basics - Anfänger-Themen 14
G Generics mit ? und Diamantoperator Java Basics - Anfänger-Themen 4
G Generics: Wildcard ? Java Basics - Anfänger-Themen 12
D Generics methode Java Basics - Anfänger-Themen 2
I Frage zu Generics und Wildcards Java Basics - Anfänger-Themen 2
N Generics und Casting eines Objekts Java Basics - Anfänger-Themen 1
A Generics Java Basics - Anfänger-Themen 6
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
W Generics - Typ zurückbekommen Java Basics - Anfänger-Themen 4
Dimax Erste Schritte Generics von Profis leicht erklärt Java Basics - Anfänger-Themen 7
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
D Generics ArrayList: Bug im Quellcode Java Basics - Anfänger-Themen 14
C Generics Java Basics - Anfänger-Themen 8
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
T Generics in Java... Java Basics - Anfänger-Themen 9
J Generics Java Basics - Anfänger-Themen 3
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
O Generics - Implementierung Java Basics - Anfänger-Themen 7
Shizmo Frage zu Generics Java Basics - Anfänger-Themen 3
F Multiple Generics Java Basics - Anfänger-Themen 10
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
H Typsicherheit/Generics Java Basics - Anfänger-Themen 1
U Java generics funktioniert nicht Java Basics - Anfänger-Themen 0
Tarrew Generics: Erste gemeinse Oberklasse als Rückgabewert Java Basics - Anfänger-Themen 1
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Generics Java Basics - Anfänger-Themen 4
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
R Compiler-Fehler Generics Problem Java Basics - Anfänger-Themen 2
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
K Generics bei Klassen- und Interfacedeklarationen Java Basics - Anfänger-Themen 3
D toArray und Generics Java Basics - Anfänger-Themen 2
D Zwei Generics beim Überladen von Methoden Java Basics - Anfänger-Themen 3
C Erste Schritte Filter für Generics oder ähnliches Java Basics - Anfänger-Themen 2
M Frage zu Generics-Deklaration Java Basics - Anfänger-Themen 5
S Frage zu Collection-Generics in Subklassen Java Basics - Anfänger-Themen 6
J Java Generics - Frage zu Types Java Basics - Anfänger-Themen 2
M <T> Generics Java Basics - Anfänger-Themen 7
T Polymorphie Generics-Problem Java Basics - Anfänger-Themen 2
B Hilfe beim Verständnis zu Generics Java Basics - Anfänger-Themen 7
J Array Generics Java Basics - Anfänger-Themen 3
J Generics casten Java Basics - Anfänger-Themen 14
J Generics wildcard Java Basics - Anfänger-Themen 6
E Listen und Generics Java Basics - Anfänger-Themen 9
X Generics Java Basics - Anfänger-Themen 6
M Datei einlesen mit generics? Java Basics - Anfänger-Themen 9
D Warum sind Generics mit Vorsicht zu genießen? Java Basics - Anfänger-Themen 6
M OOP Mit Generics auf Methoden zugreifen? Java Basics - Anfänger-Themen 10
S Generics Java Basics - Anfänger-Themen 4
G Generics kein Zugriff auf getter eines Objekts Java Basics - Anfänger-Themen 4
L Datentypen Problem mit Generics und null Java Basics - Anfänger-Themen 6
E Klassen java.util.ArrayList<E> als Generics Java Basics - Anfänger-Themen 16
W Interface Problem mit Generics Java Basics - Anfänger-Themen 2
M OOP Generics und Wildcards Java Basics - Anfänger-Themen 3
D Generics - Warnmeldungen Java Basics - Anfänger-Themen 2
M Polymorphie generics einsteigerprobleme Java Basics - Anfänger-Themen 3
D Vererbung Generics und Vererbung Java Basics - Anfänger-Themen 8
C Generics Array Java Basics - Anfänger-Themen 43
D Fehler mit generics Java Basics - Anfänger-Themen 10
S Generics - CaseInsensitiveMap selber schreiben? Java Basics - Anfänger-Themen 5
K Datentypen Generics Java Basics - Anfänger-Themen 3
P Comparable und Generics Java Basics - Anfänger-Themen 6
I Generics (Subtypen) Java Basics - Anfänger-Themen 17
N Typeinschränkung bei Generics Java Basics - Anfänger-Themen 13
C Generics und Cast Java Basics - Anfänger-Themen 5
H Generics werden in -source 1.2 nicht unterstützt Java Basics - Anfänger-Themen 16
M Datentypen Generics: Exacten Typ ermitteln Java Basics - Anfänger-Themen 6
N Generics und Interfaces Java Basics - Anfänger-Themen 5
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
lumo Java Generics Java Basics - Anfänger-Themen 19
M verlinkte Liste mit generics Java Basics - Anfänger-Themen 7
capgeti Datentypen Static methoden aus Superklasse mit Generics definieren? Java Basics - Anfänger-Themen 9
S Generics und Typerkennung Java Basics - Anfänger-Themen 7
A Cast ohne Warnung bei Generics Java Basics - Anfänger-Themen 2
B Java Listen und Generics Java Basics - Anfänger-Themen 35
O Abstract Method & Generics Java Basics - Anfänger-Themen 10
K Aufgabe Generics Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben