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

321

    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. Onko sulla

      suoja työ paikka? 🤔🤷‍♂️
      Ikävä
      34
      3996
    2. Joensuun kaupunki levittelee tonttitietoja Keskisuomalaiselle

      Sähköposteja ja tonttitietoja levitellään mm. Pasi Koivumaalle
      Joensuu
      13
      1899
    3. Oletko nainen alkanut kammoamaan minua

      Sinua ei näy eikä kuulu, ja ilmeisesti kiertelet tilanteita. Oletko huomannut, että olet vieläkin ajatuksissani luvattom
      Ikävä
      63
      1364
    4. Saako 60 v vielä töitä? Arto Nyberg puhuu suoraan elämästä ilman töitä

      Arto Nyberg täyttää tänään 60 v. Onnea! Nyberg totuttiin näkemään suoran haastatteluohjelman kapteenina vuodesta toise
      Maailman menoa
      95
      1296
    5. Toivoisitko Rakas vielä?

      Haluaisitko vielä? Uskoisin osaavani näyttää sinulle, kuinka ainutlaatuinen nainen olet.
      Ikävä
      68
      1195
    6. Tiesitkö tätä ex-miehistä? Noriko Salo jysäytti yllätyspaljastuksen

      Noriko Salo ja ex-F1 kuski Mika Salo olivat naimisissa v. 1999-2022. Kirsi Salon ex-mies puolestaan on muusikko Sammy A
      Kotimaiset julkkisjuorut
      5
      1051
    7. Koska tajusit silloin aikanaan

      että olin ihastunut sinuun? 🤭😍 Taisin olla aika läpinäkyvä 🫣❤️
      Ikävä
      47
      951
    8. Keskustelua kasteesta

      You tubessa kaksi pappia keskustelivat kasteesta ja kritisoivat raamatullista uskovien kastetta. Toinen heistä yritti
      Kaste
      333
      924
    9. Ihan pieni näkeminen vaan

      👋 ja minä olisin valmis jo vaikka mihin sun kanssa. Nämä on näitä.. 🤫🫣😘💥
      Ikävä
      26
      911
    10. En haluaisi kaiken kuihtuvan pois

      ilman, että olemme voineet jutella rauhassa kasvotusten... Mutta mistä ihmeestä löydän sinut?
      Ikävä
      39
      892
    Aihe