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

279

    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äästäminen on typerää, muistakaa äänestää demareita

      Säästäminen on typerää, koska aiheuttaa vain talouden taantumista ja lopulta tappaa potilaan. Demareiden tapa on satsat
      Maailman menoa
      107
      7867
    2. Olli Rehn: Eläkkeistä pitää leikata. Nyt tuli Lindtmanille kauhun paikka

      jos johtaa seuraavaa hallitusta. Purra: eläkkeisiin ei kosketa. Eikä tällä hallituskaudella varmasti kosketa, mutta seur
      Maailman menoa
      418
      7014
    3. SDP:n budjetin peruskivi: "Rahaa nimittäin on!"

      Demarien talouspolitiikan ydin on usein tiivistetty klassiseen meemiin: rahaa on, kunhan se on jonkun muun rahaa. Vuoden
      Maailman menoa
      168
      5274
    4. Poliisien suosikkipuolueet ylivoimaisesti: Kokoomus ja persut

      samoin on armeijan henkilöstön kanssa. Sen sijaan sekä vihreät, vasliitto ja SDP ovat hyljeksittyjä puolueita poliisien
      Maailman menoa
      109
      4213
    5. Kun täällä kysytään aina vaan naisilta

      Niin nyt kysytään miehiltä. Mies, voisitko ottaa kumppaniksesi naisen joka nostaa enemmän penkistä kuin sinä? Tienaa en
      Sinkut
      74
      4107
    6. Sdp, Vihreät ja vasemmistoliitto muuttumassa naisten puolueiksi?

      Sdp 64 % naisia, vihreät 70 % naisia ja vasemmistoliitto 60 % naisia. Ilmankos ne puolueet ajaa autoilevien kantasuomal
      Maailman menoa
      95
      4106
    7. Hatunnosto! Mari Hynynen (os. Perankoski) ja Jouni Hynynen auttavat vähäosaisia upealla tavalla!

      Hatunnosto! Mari ja Jouni Hynynen ovat Vailla vakinaista asuntoa ry:n uudet kummit. Hynysiä motivoi halu lisätä ymmärr
      Maailman menoa
      10
      3842
    8. Tiesitkö? Tämä suomalainen keksi Elämäni biisi -sarjan - Viinin lipittely mainittu!

      Tiesitkö? Elämäni biisi on suomalainen formaatti ja sen takana on Petja Peltomaa. Hänen kynästä ovat lähtöisin myös mm.
      Tv-sarjat
      0
      3530
    9. Epäonnistunut "Tuppurais-operaatio" kaatoi Purran hallituksen

      Persut yrittivät viimemetreillä häivyttää omaa täydellistä epäonnistumistaan syyttämällä opposition edustajaa nimettömil
      Maailman menoa
      13
      2390
    10. Ostaisitko sinä rempattavan asunnon Italiasta tai jostain muualta ulkomailta, mistä?

      Ella Kanninen on tehnyt Italiassa asuntokaupat. Hän kertoo Instagramissa kierrelleensä viime kesänä Toscanassa katselema
      Asunnot ja asuminen
      16
      1969
    Aihe