Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

13.11.2012, 20:15

[Java] Generischer Datentyp unwirksam

Hallo Zusammen ;)

Ich habe eine einfache generische Klasse welche eine Koordinate in einem beliebigen Number Datentyp representiert:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class XY<T extends Number> {

    public T x;
    public T y;
    
    public XY(T x, T y){
        this.x = x;
        this.y = y;
    }

    public T getX() {
        return x;
    }

    public void setX(T x) {
        this.x = x;
    }

    public T getY() {
        return y;
    }

    public void setY(T y) {
        this.y = y;
    }

}


Dann habe ich noch eine Klasse von der alle meine Gui Elemente erben (hier vereinfacht dargestellt):


C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class GuiElement<T> {

    private XY<Integer> size;
    private XY<Integer> pos;
    private XY<Integer> padding;
    private GuiElement parent; // Übergeordnetes Gui Element
    
    // ...

        
    public XY<Integer> getAbsolutPos(){
        int x;
        int y;
        if(this.parent != null){
          x = (Integer)this.parent.getPos().x + this.getPos().x + this.padding.x; // <-----------
          y = (Integer)this.parent.getPos().y + this.getPos().y + this.padding.y;
        } else {
          x = this.getPos().x + this.padding.x;
          y = this.getPos().y + this.padding.y;
        }
        return new XY<Integer>(x,y);
    }

    public XY<Integer> getPos() {
        return pos;
    }
   
   // ...


Jetzt zu meiner Frage:
Warum ist an der Markierten stelle dieser Cast notwendig bzw. warum bekomme ich nicht direkt einen Integer durch "this.parent.getPos().x" sondern ein Number Objekt ?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »hetzge« (13.11.2012, 20:22)


Darkrel

Treue Seele

Beiträge: 143

Wohnort: Zürich

Beruf: Student ETH Zürich

  • Private Nachricht senden

2

13.11.2012, 21:09

Homogene Übersetzung.

Wenn du GuiElement ohne einen generischen Parameter instanzierst, wird der generische Parameter als "Object" angenommen. Deshalb musst du casten.
Java übersetzt generische Parameter homogen, d.h. auch ein GuiElement<Integer> wird intern zu GuiElement. Java fügt einfach die benötigten casts hinzu.
Wenn du den generischen Parameter nicht angibst, musst du dementsprechend auch von Hand casten.

Edit: Oh mist, du gibst ja XY<Integer> zurück. Damit ist meine Antwort natürlich nicht von Belang.
:cursing:

3

13.11.2012, 21:23

Weil durch das Weglassen von <...> bei "GuiElement parent" das ganze ein raw-Type wird und alle generischen Informationen verloren gehen. Mach stattdessen "GuiElement<?> parent".

4

13.11.2012, 21:38

@Darkel
Auch wenn es du knapp daneben lagst hast du mich darauf gebracht, dass es nicht am XY generischen Typ liegt sondern an dem vom GuiElement. ;)

@Chromanoid
Danke für die richtige und erklärende Antwort. Jetzt klappt das auch so wie es soll.

Werbeanzeige