Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Java] Generics: aanmaken van een generieke array lukt niet*

Pagina: 1
Acties:
  • 206 views sinds 30-01-2008
  • Reageer

  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
Waarom kan het volgende stukje code niet?

Java:
1
LinkedList<E>[] table = new LinkedList<E>[length];


Het gaat dus om een array met LinkedList objecten.

Kortom: waarom kan ik geen generieke array aanmaken? Iemand die weet hoe ik dit kan oplossen?

Ik kan hem wel als volgt aanmaken maar dan zegt eclipse: "Type safety: The expression of type LinkedList[] needs an unchecked conversion to conform to LinkedList<E>[]"

Java:
1
LinkedList<E>[] table_ = new LinkedList[len_];

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 20-11 15:59

Gerco

Professional Newbie

Die eerste kan niet omdat door type erasure het concrete type E niet bekend is @runtime. Dus kun je er ook geen instanties van maken. Generics is een puur compile-time ding. Die tweede kan prima, maar geeft een waarschuwing omdat hij niet kan garanderen dat er alleen E objecten in die LinkedList zitten, je maakt immers een LinkedList en niet een LinkedList<E>.

Dit kan bijvoorbeeld weer wel:
Java:
1
2
3
4
5
6
7
8
9
public class Gentest<T> {
    
    private LinkedList<T>[] lists;
    
    public void setLists(LinkedList<T>[] lists) {
        this.lists = lists;
    }

}


Hoe je aan zo'n array gaat komen is een ander verhaal, zoals hier uitgelegd staat.

[ Voor 33% gewijzigd door Gerco op 24-01-2008 22:49 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • YopY
  • Registratie: September 2003
  • Laatst online: 06-11 13:47
Als je een generic wilt maken waar je alle typen objecten in kunt pleuren, moet je een LinkedList van Objecten maken

code:
1
LinkedList<Object> list = new LinkedList<Object>();.


Echter, dit doet het hele punt van generics teniet.

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 20-11 18:44
Dat brengt ons bij de vraag: wat wil je bereiken? ;)

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
Het is een schoolopdracht, de opdracht zelf is klaar maar ik zat nog even te stoeien met die generics.

http://i31.tinypic.com/35jxz03.jpg

De leraar dwingt ons dus een array met generics te gebruiken, niet goed te implementeren dus als ik het goed begrijp?

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 20-11 15:59

Gerco

Professional Newbie

Die constructor zal helemaal niet compilen omdat je zo'n generic array niet kan aanmaken. Ik zou die leraar eens vragen die code te compileren :P

[ Voor 3% gewijzigd door Gerco op 24-01-2008 23:11 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
Gerco schreef op donderdag 24 januari 2008 @ 23:10:
Die constructor zal helemaal niet compilen omdat je zo'n generic array niet kan aanmaken. Ik zou die leraar eens vragen die code te compileren :P
Ja ik heb die <E> ook moeten weghalen in de constructor, ik ga eens wat lezen over type erasure en dan eens kijken of ik hem nog wat kan leren ;)

tnx voor de input!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 20-11 18:44
Hmm, je kunt geen generic array aanmaken. Als alternatief kun je wel een ArrayList gebruiken:
Java:
1
2
3
4
5
6
7
8
9
10
11
public class ChainingHashDemo<E>
{
    ArrayList<LinkedList<E>> table_;
    int len_ = 10;
    
    public ChainingHashDemo()
    {
        table_ = new ArrayList<LinkedList<E>>(len_);
        for (int i = 0; i < table_.size(); i++)
            table_.set(i, null);
    }
Gooi je ten minste niet je typesafety overboord. :)

[ Voor 243% gewijzigd door Jaap-Jan op 24-01-2008 23:42 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 20-11 09:31
Zie ook paragraaf 7.3 van de Sun generics tutorial voor meer informatie over dit specifieke 'probleem'.
Sowieso is het verstandig om de hele tutorial even door te nemen (ook voor jouw docent blijkbaar :X)

[ Voor 8% gewijzigd door Kwistnix op 24-01-2008 23:42 ]


  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
Jaap-Jan schreef op donderdag 24 januari 2008 @ 23:29:
Hmm, je kunt geen generic array aanmaken. Als alternatief kun je wel een ArrayList gebruiken:
Java:
1
2
3
4
5
6
7
8
9
10
11
public class ChainingHashDemo<E>
{
    ArrayList<LinkedList<E>> table_;
    int len_ = 10;
    
    public ChainingHashDemo()
    {
        table_ = new ArrayList<LinkedList<E>>(len_);
        for (int i = 0; i < table_.size(); i++)
            table_.set(i, null);
    }
Gooi je ten minste niet je typesafety overboord. :)
Yep maar hij wil dat wij een rehash functie maken, dus als de vullingsgraad te hoog wordt dan moet de array 2 keer zo groot worden en moet hij opnieuw gevuld worden, vandaar de Array.

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 20-11 18:44
Misschien dat ik het punt mis, maar je kunt met een ArrayList in principe hetzelfde doen als met een array, kort door de bocht gesteld is alleen de schrijfwijze anders.

Je algoritmiek hoeft in principe niet te veranderen als je ArrayList gebruikt in plaats van een array, enkel de schrijfwijze.

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 20-11 15:59

Gerco

Professional Newbie

@Jaap-Jan: Maar met een ArrayList hoef je geen rehash functie te maken, dat doet hij namelijk zelf al (nu ja, de array groeien iig). Daar heb je weinig aan als de opdracht is zo'n rehash functie te maken. De leraar had beter een array van Objects, Strings of ints kunnen gebruiken, want Generics voegt helemaal niets toe aan deze opdracht.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • YopY
  • Registratie: September 2003
  • Laatst online: 06-11 13:47
idd, ik heb het idee dat de leraar je vraagt om de ArrayList in Java opnieuw te implementeren. Wat trouwens wel een leuke opdracht kan zijn. Maar er zou wat dat aangaat genoeg over te vinden zijn. Zelf heb ik de afgelopen tijd ook geprobeerd een generic class te maken, en dat valt nog niet mee - er zitten nogal een aantal haken en ogen aan. Nu zou dat in dit geval niet zo'n groot probleem moeten zijn, maar toch.
Pagina: 1