diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/Ajoneuvo.java b/src/main/java/fi/utu/tech/ooj/exercise3/Ajoneuvo.java index 24473fc5c076e35555345928bb841c48491e82c8..c686aa5caf29ee529f95d6e46686f4a83fc8717f 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/Ajoneuvo.java +++ b/src/main/java/fi/utu/tech/ooj/exercise3/Ajoneuvo.java @@ -40,6 +40,7 @@ abstract class Ajoneuvo { * jolloin Ajoneuvon, HenkiloAuton ja KuormaAuton tulisi toteuttaa Comparable rajapinta ja * compareTo- rutiini, tai antaa TreeSetille oma Comparator syötteenä, jotta TreeSet voi * asettaa alkiot järjestykseen. + * (Vastaukset myös tiedostossa 'Tehtava 5 vastaukset'.) */ public static <X extends Z, Y extends Z, Z extends Ajoneuvo> Set<Z> yhdista(Set<X> xs, Set<Y> ys){ var tmp = new TreeSet<Z>(); diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/Kirja.java b/src/main/java/fi/utu/tech/ooj/exercise3/Kirja.java index c5b37ca5ce352214d2ec0fba004c4ebebed976ce..6d83839f58b5bab16639709c443b14090b959490 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/Kirja.java +++ b/src/main/java/fi/utu/tech/ooj/exercise3/Kirja.java @@ -64,4 +64,8 @@ public class Kirja implements Cloneable{ } return true; } + @Override + public int hashCode(){ + return 127*kirjanNimi.hashCode()+kirjailijanNimi.hashCode()+julkaisuVuosi; + } } diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/KirjaKokoelma.java b/src/main/java/fi/utu/tech/ooj/exercise3/KirjaKokoelma.java index 9896e35f1621127db7b10e97a52c8866308573e0..6ecb565fca793ec206ff071852956b14bd9415c7 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/KirjaKokoelma.java +++ b/src/main/java/fi/utu/tech/ooj/exercise3/KirjaKokoelma.java @@ -79,4 +79,8 @@ public class KirjaKokoelma implements Cloneable{ } return true; } + @Override + public int hashCode(){ + return 127*kokoelmanNimi.hashCode()+kirjaListaus.hashCode(); + } } diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/Kirjasto.java b/src/main/java/fi/utu/tech/ooj/exercise3/Kirjasto.java index 53232bd0dba214c0678b50b1e3a17685c7857846..1ef2a6d33f824f8c955d69ea630838eb50999d23 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/Kirjasto.java +++ b/src/main/java/fi/utu/tech/ooj/exercise3/Kirjasto.java @@ -136,4 +136,9 @@ public class Kirjasto implements Cloneable{ } return true; } + + @Override + public int hashCode(){ + return 127*kirjastonNimi.hashCode()+osoite.hashCode()+kokoelmat.hashCode()+sivukirjastot.hashCode(); + } } diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/Main.java b/src/main/java/fi/utu/tech/ooj/exercise3/Main.java index bd992bb96ec0916858f593ca98ef2e68eebc5dec..3e4b9f2d75aa0952da1d1010b9d348e827403e97 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/Main.java +++ b/src/main/java/fi/utu/tech/ooj/exercise3/Main.java @@ -78,8 +78,8 @@ public class Main { rm.put("Eka", 1); rm.put("Toka", 2); rm.put("Kolmas", 3); - System.out.println(rm.get("Eka")); - System.out.println(rm.get("Neljäs")); + System.out.println("Avainta Eka vastaava arvo: "+rm.get("Eka")); + System.out.println("Avainta Neljäs vastaava arvo (avainta ei ole):"+rm.get("Neljäs")); @@ -92,11 +92,32 @@ public class Main { * on ylhäältä rajoitettu kokoelman tyyppiin eli Ajoneuvo-luokkaan. Javan * dokumentaatiossa metodi on public boolean addAll(Collection<? extends E> c). * + * Listoja henkiloautot ja kuormaautot ei voida sijoittaa muuttujaan ajoneuvot, + * sillä nämä eivät ole tyypilään enää yhteensopivia, vaan geneerisen toteutuksen + * vuoksi käytännössä omia aliluokkiaan. * + * Määrittelyn voisi korjata yhteensopivaksi luomalla ajonevot viittaus toisenlaisella + * tyypin määrittelyllä, kuten HashSet<? extends Ajoneuvo> ajoneuvot = new HashSet<>(); + * jolloin ajoneuvot kokoelman tyyppi on vapaa, mutta ylhäältä rajoitettu Ajoneuvot + * luokkaan. + * (Vastaukset myös tiedostossa 'Tehtava 5 vastaukset'.) */ - HashSet<Ajoneuvo> ajoneuvot = new HashSet<Ajoneuvo>(); + + //tehtäväpohjan alkuperäinen viittaus + //HashSet<Ajoneuvo> ajoneuvot = new HashSet<Ajoneuvo>(); + + //Tehtävän 5B mukainen yhteensopiva viittaus ylhäältä Ajoneuvot-luokkaan rajoitetulla + //vapaalla tyypillä '?'. + HashSet<? extends Ajoneuvo> ajoneuvot = new HashSet<>(); + + //henkiloautot kokoelman geneerinen alityyppi on Henkilöauto HashSet<HenkiloAuto> henkiloautot = new HashSet<HenkiloAuto>(); + //kuormaautot kokoelman geneerinen alityyppi on Kuormaauto HashSet<KuormaAuto> kuormaautot = new HashSet<KuormaAuto>(); + //Nyt ajoneuvot on tyyppiyhteensopiva sekä henkiloautot... + ajoneuvot=henkiloautot; + //että kuormaautot kokoelmien kautta, sillä ne ovat polymorfisesti Ajoneuvoja + ajoneuvot=kuormaautot; } } diff --git a/src/main/java/fi/utu/tech/ooj/exercise3/Tehtava 5 vastaukset b/src/main/java/fi/utu/tech/ooj/exercise3/Tehtava 5 vastaukset index a4f610f19084f3f2d209922cfac94480c0c04ebd..8b79f4ecaa6c4063e5b0ce9ae1e213976b697c75 100644 --- a/src/main/java/fi/utu/tech/ooj/exercise3/Tehtava 5 vastaukset +++ b/src/main/java/fi/utu/tech/ooj/exercise3/Tehtava 5 vastaukset @@ -17,4 +17,13 @@ Vastaus 5B) kuorma-autot ovat polymorfisesti myös Ajoneuvoja ja addAll- metodin toteutuksessa on käytetty syötteenä vapaan tyypin kokoelmaa, jonka tyyppi on ylhäältä rajoitettu kokoelman tyyppiin eli Ajoneuvo-luokkaan. Javan - dokumentaatiossa metodi on public boolean addAll(Collection<? extends E> c). \ No newline at end of file + dokumentaatiossa metodi on public boolean addAll(Collection<? extends E> c). + + Listoja henkiloautot ja kuormaautot ei voida sijoittaa muuttujaan ajoneuvot, + sillä nämä eivät ole tyypilään enää yhteensopivia, vaan geneerisen toteutuksen + vuoksi käytännössä omia aliluokkiaan. + + Määrittelyn voisi korjata yhteensopivaksi luomalla ajonevot viittaus toisenlaisella + tyypin määrittelyllä, kuten HashSet<? extends Ajoneuvo> ajoneuvot = new HashSet<>(); + jolloin ajoneuvot kokoelman tyyppi on vapaa, mutta ylhäältä rajoitettu Ajoneuvot + luokkaan. \ No newline at end of file