[Java]Generics en het extenden van ArrayList

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Standeman
  • Registratie: November 2000
  • Laatst online: 10:01

Standeman

Prutser 1e klasse

Topicstarter
Generics is nooit mijn sterkste punt geweest, maar het volgende snap ik even niet!

Ik wil graag een lijst van SelectItem objecten met wat extra features meer dan ArrayList al heeft, dus dacht ik slim te zijn en het alsvolgt op te lossen:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class SelectList<SelectItem> extends ArrayList
{
    private String selectedValue;

    public String getSelectedValue()
    {
        String value = null;
        if (selectedValue != null)
        {
            value = selectedValues.get(0);
        }
        else
        {
            if (this.size() > 0)
            {
                SelectItem si = (SelectItem) this.get(0);
                value = si.getValue();
            }
        }
        return value;
    }
}


nu krijg ik te zien bij het compilen (en ook in mijn IDE):

code:
1
2
3
4
SelectList.java:17: cannot find symbol
symbol  : method getValue()
location: class java.lang.Object
                si.getValue();


Ik snap niet waarom si niet "gecast" wordt naar een SelectItem object waar zeker weten de getValue() method in zit. Volgens de auto-complete van mijn IDE is het type van si java.lang.Object :?

The ships hung in the sky in much the same way that bricks don’t.


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 06:59

RayNbow

Kirika <3

Standeman schreef op vrijdag 30 oktober 2009 @ 11:30:

Java:
1
2
public class SelectList<SelectItem> extends ArrayList
//                           ArrayList van wat ^ ?
Verder, let wel op LSP wanneer je aan inheritance doet.

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • Standeman
  • Registratie: November 2000
  • Laatst online: 10:01

Standeman

Prutser 1e klasse

Topicstarter
RayNbow schreef op vrijdag 30 oktober 2009 @ 11:35:
[...]
Verder, let wel op LSP wanneer je aan inheritance doet.
Ik had nog nooit van LSP gehoord, interessant.

overigens met het volgende heb ik exact hetzelfde probleem met:
Java:
1
public class SelectList<SelectItem> extends ArrayList<SelectItem>


* Standeman moet zich echt wat meer in de principes achter generics gaan verdiepen!

The ships hung in the sky in much the same way that bricks don’t.


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 06:59

RayNbow

Kirika <3

Ah wacht, ik snap het probleem nu...

Wat je eerst had:
Java:
1
2
public class SelectList<SelectItem> extends ArrayList
//                       ^ dit is een *type parameter*

Wat ik min of meer voorstelde:
Java:
1
2
3
public class SelectList<T> extends ArrayList<T>
//                      ^                    ^
//                    2 dezelfde *type parameters*

De juiste oplossing:
Java:
1
2
3
public class SelectList extends ArrayList<SelectItem>
//                                           ^
//                                 *concreet* type


Btw, de cast op regel 16 in je oorspronkelijke code is niet nodig.

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Logisch, het enige dat dit verandert is dat de cast op regel 16 dan niet meer nodig is.
Het punt is dat de compiler het type van SelectItem niet kent, wat een generic type is voor je class (en dus niet het concrete type SelectItem), en dus gaat hij uit van de least common denominator: Object. Maar wellicht wil je helemaal niet dat je class een generic class is, en bedoel je gewoon dit?
Java:
1
public class SelectList extends ArrayList<SelectItem>


Tenzij je wel wil dat je class een generic class is, en dat de objecten die je erin stopt SelectItem's zijn, of afgeleiden daarvan. Daarvoor doe je (geloof ik) dit:
Java:
1
public class SelectList<T extends SelectItem> extends ArrayList<T>

Nu weet de compiler dat de T waarmee je SelectList geinstantieerd wordt iig van het type SelectItem is, en dus kun je een getValue() op zo'n object van type T doen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Standeman
  • Registratie: November 2000
  • Laatst online: 10:01

Standeman

Prutser 1e klasse

Topicstarter
RayNbow schreef op vrijdag 30 oktober 2009 @ 11:53:
Ah wacht, ik snap het probleem nu...

Wat je eerst had:
Java:
1
2
public class SelectList<SelectItem> extends ArrayList
//                       ^ dit is een *type parameter*

Wat ik min of meer voorstelde:
Java:
1
2
3
public class SelectList<T> extends ArrayList<T>
//                      ^                    ^
//                    2 dezelfde *type parameters*

De juiste oplossing:
Java:
1
2
3
public class SelectList extends ArrayList<SelectItem>
//                                           ^
//                                 *concreet* type


Btw, de cast op regel 16 in je oorspronkelijke code is niet nodig.
Ik was er heel toevallig net ook achtergekomen door trial and error. In iedergeval bedankt. Wat ik alleen geen bal van snap is waarom bij
Java:
1
public class SelectList<SelectItem> extends ArrayList<SelectItem>

de compiler blijkbaar vind dat si nog steeds java.lang.Object is?

Ik snap nu wel waarom SelectList<SelectItem> voor geen meter werkt :)

The ships hung in the sky in much the same way that bricks don’t.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

.oisyn schreef op vrijdag 30 oktober 2009 @ 11:57:
Het punt is dat de compiler het type van SelectItem niet kent, wat een generic type is voor je class (en dus niet het concrete type SelectItem), en dus gaat hij uit van de least common denominator: Object.
;)

[ Voor 8% gewijzigd door .oisyn op 30-10-2009 12:03 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Standeman
  • Registratie: November 2000
  • Laatst online: 10:01

Standeman

Prutser 1e klasse

Topicstarter
:) Ik had je post nog niet gelezen :P

In iedergeval is het helemaal duidelijk nu.Thanx

The ships hung in the sky in much the same way that bricks don’t.

Pagina: 1