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

258

    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. S-kaupoissa on nykyään ihanaa käydä

      Kun niissä ei enää käy satuolentoihin uskovat hihhuIit eivätkä persut. Asiakaskunta on huomattavasti siistiytynyt muutam
      Maailman menoa
      247
      14139
    2. Riikka runnoo! Uutta velkaa tänä vuonna 17 mrd. euroa

      Tirsk. Nyt kyllä hihityttää kuin pientä eläintä. Riikka takoo maailmanennätyksiä tasaiseen tahtiin. " [Riikka] joutuu
      Maailman menoa
      61
      7210
    3. Jens Ihlen (ex Kukka) poika todistaa oikeudessa

      10:49 "Välit ovat olemattomat" Minkälainen isäsi ja sinun välinen suhde on tällä hetkellä? "Minulla ei ole minkäännäkö
      Maailman menoa
      199
      6902
    4. Kela maksoi etuuksia 17,3 mrd. eur, yritykset sai 10,6 mrd.

      Tuohon päälle vietiin vielä palkansaajilta työeläkeloisille 27,5 miljardia euroa. Etenkin Suomen Sosialistiset Yrittäjä
      Maailman menoa
      40
      5016
    5. K-kaupassa on mukava käydä, kun ei tarvitse katsella köyhiä

      vasemmistolaisia, joista monet myös varastavat. Mielellään maksaa vähän enemmän tuotteista K-kaupassa, jotka ovat paljon
      Maailman menoa
      104
      4781
    6. Näin tyhmä vasemmistolainen on: "S-kaupoissa on nykyään ihanaa käydä

      kun siellä ei ole hihhuleita eikä persuja." Vain tyhmä eli heikkoälyinen vasemmistolainen voi tehdä noin lapsellisia ju
      Maailman menoa
      74
      4677
    7. Suomeen ei kuulu ihmiset jotka ei halua kätellä toisia ihmisiä, koska tämä on vääräuskoinen

      Nainen joka ei halunnut kätellä Stubbia on selvästi ääripään muslimi, eli sitä sakkia josta niitä ongelmia koituu. Ulos
      Maailman menoa
      78
      4373
    8. PS:n Purra teki -JÄTTI-VELAT

      * * PS:n Purra teki -JÄTTI-VELAT - ! ja jätti MaksuHuolet -Kansan Maksettavaksi -! *
      Maailman menoa
      19
      4361
    9. Suomessa on ollut suurtyöttömyyttä ennenkin, ja lääkäriin pääsee nykyäänkin

      Täällähän oli jonkun sekopään(vas.) juttu, että ennen ei ollut työttömyyttä ja lääkäriin pääsi. Siihen alkoi tietysti ko
      Maailman menoa
      75
      4132
    10. Kysymys: Kuinka moneen maahan neuvosto-venäjä on hyökännyt

      viimeisten 90-vuoden aikana? Ja lähinnä on siis kyse neuvosto-venäjän naapurimaista - kuten Suomesta. Lista on huomatta
      Maailman menoa
      101
      3921
    Aihe