capture-of ?

selitystä kiitos

Mitä eroa on seuraavilla

Vector v = new Vector();
Vector v2 = new Vector();

ja mitä tuo kysymysmerkki oikein tarkoittaa? Millon tahansa sitä käytänkin, tulee virhe "The method add(capture-of ?) in the type Vector is not applicable for the
arguments (Object)"

Mitä tuo tarkoittaa ja miten sen voi kiertää? Tiedän kyllä mitä parametrisoidut tyypit on, mutta tuo kysymysmerkki ei ole oikein auennut.

2

300

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Ööööööö

      Kysymysmerkki tarkoittaa sitä, ettei geneerisen muuttujan tyyppi parametria tunneta. Esimerkkisi tapauksessasi et voi käyttää add -metodia (jota ilmeisesti yrität) koska kääntäjä ei pysty tekemään tyyppi tarkastusta, vaan antaa mainitsemasi virheen. Asian voi kiertää julmasti pakotetulla tyyppimuunnoksella esim. '((Vector) v2).add("moi moi")', mutta silloin ohjelman suunnittelu on mennyt metsään. Get -metodia toki pystyt käyttämään esim. 'Object o = v2.get(0)'. Yleensä tuota kysymysmerkkiä käytetään metodien esittelyissä, silloin kun metodin ei tarvitse tietää geneerisnen muuttujan tyyppi parametria, esim:

      public static void tulosta(Vector vektori) {
         for (Object objekti : vektori)
            System.out.println(objekti);
      }

      Yllä oleva metodi pystyy tulostamaan kaikki Vector oliot. Tai vastaavasti kysymys merkkiä voidaan käyttää seuraavasti:

      public static void liikuta(Vector

      • Ööööööö

        Kysyit sitä eroa, niin se on siinä, että esimerkissäsi v2 -muuttuja on esitetty geneerisenä kun taas v -muuttujaa ei. Kääntäjä kohtelee kyseisiä muuttujia erillä tavalla. Geneerisyyden hyöty on juuri siinä, ettei tyyppi tarkastuksia ja muunnoksia tarvitse lisätä koodin itse. Ennen piti tehdä seuraavasti:

           Vector autot = new Vector()
           v.add(new Auto("Ford"));
           Auto eka = (Auto) autot.get(0);

        Nykyään voi tehdä seuraavasti:

           Vector autot = new Vector()
           autot.add(new Auto("Ford"));
           Auto eka = autot.get(0);

        Ennen pystyi koodaamaan myös väärin, joka johti ajonaikaiseen virheeseen (riville 3):

           Vector autot = new Vector()
           v.add(new Juna("Pikajuna"));
           Auto eka = (Auto) autot.get(0);

        Mutta kun käyttää geneerisiä esittelyjä, huolehtii kääntäjä tyyppi tarkastuksesta käännös aikaisesti ja antaa virheen jo käännös vaiheessa (riville 2):

           Vector autot = new Vector()
           v.add(new Juna("Pikajuna"));
           Auto eka = autot.get(0);

        Esim. Eclipse heittää punaista riville kaksi ja sen mainitsemasi virheen ("capture-of ?" => "Auto" ja "Object" => "Juna"). Näytit yrittävän lisätä Object luokaan kuuluvaa oliota sinne vektoriin, joten jos väkisin haluat saada toimimaan sen koodin, niin voit kokeilla muuttaa v2:n määrittelyn seuraavaksi: "Vector v2 = new Vector()". Tuota kutsutaan näköjään vapaaksi tyypiksi ja alla olevassa linkissä näyttää olevan jotain siitä ja sen rajoitteista, luvussa 7:

        http://www.cs.utu.fi/staff/jouni.smed/SHR07-SPOO.pdf

        Alla viellä muutama linkki:

        http://en.wikipedia.org/wiki/Generics_in_Java
        http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

        Tuossa yllä olevassa linkissä on kerrottu kappaleessa viisi tuosta add käskyyn liittyvästä ongelmasta vapailla tyypeillä, ja siitä miten ongelma yleensä ratkaistaan.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Perintovero 100 prosenttiin, työeläkkeet ja maataloustuet pois

      Noilla eväillä lähden tasapainottamaan valtiontaloutta ja korjaamaan työntekijöiden palkkakuoppaa nostamatta työnantajie
      Maailman menoa
      411
      6805
    2. Riikka runnoo: polttoöljyn hinta nousi maaliskuussa 40 prosenttia

      Onko irvistelijällä sakset hävinneet, vai miksei osaa leikata polttoaineiden hintaa kansalaisten kukkarolle sopivalle ta
      Maailman menoa
      90
      4354
    3. Dannysta tulee isä 83-vuotiaana

      Huh huh sentään sellaista naista, joka laitattaa itsensä paksuksi ikälopulle papalle ! Ajatellaanko lapsen oikeuksia oll
      Maailman menoa
      104
      4284
    4. Purra ryöväsi Marinin Itä.-Suomelle neuvottelemat EU-rahat

      Perust vihaavat suomalaisia, mutta eritoten itäsuomalaisia. "Osa kaksikäyttörahoista on alun perin Itä- ja Pohjois-Suom
      Maailman menoa
      44
      3694
    5. Miksi persut hyökkäävät jatkuvasti henkilöitä päin?

      Miksei persut yritä lainkaan korjata asioita, vaan koko ajan haukkuvat henkilöitä? Ei tuollaisilla turvanpieksäjillä ole
      Maailman menoa
      137
      3668
    6. Seida Sohrabi: Suomi ei ole rasistinen maa

      Seidalta taas täyttä asiaa. Miksi punavihreät naiset eivät pysty samaan - no se ideologia estää. "Meillä on valitettava
      Maailman menoa
      156
      3652
    7. Demariskandaali! Eveliina Heinäluoma (sdp) kahmii kaikki Hitas asunnot itselleen!

      Heinäluoma on ostanut useita yhteiskunnan tukemia, hintasäännösteltyjä asuntoja itselleen! Ei ihme, että Hitas on ollut
      Maailman menoa
      248
      3579
    8. Ketkä haukkuu suomalaisten ÄO:tä?

      Siinä on kaksi vaihtoehtoa, joko siis rutiköyhä vajaaälyinen vasuri tai venäläinen. Kyllähän täällä käy suomenvenäläisi
      Maailman menoa
      41
      3123
    9. Pääsiäisen kunniaksi tekoälyn analyysi Riikka Purran kirjoituksesta

      🧠 Mitä kirjoitus kertoo Riikka Purrasta? 1. Asenteellinen ja epäasiallinen sävy: Kirjoitus pursuaa halveksivaa, jopa a
      Maailman menoa
      14
      3094
    10. Demarien sanoin kuvaamaton ahneus - Eveliina Heinäluoma vain yksi esimerkki

      Mutta näin se on demari-eliitissä aina ollut, käytännössä siis nämä eliittiin kuuluvat ovat puhtaasti porvareita - Marin
      Maailman menoa
      116
      2850
    Aihe