From 1b8129b0a65fd5e55c740092d4fa8994032e0d3b Mon Sep 17 00:00:00 2001
From: Heikki Viljanen <hmvilj@utu.fi>
Date: Mon, 15 May 2023 13:44:52 +0300
Subject: [PATCH] korjauksia hashCode() metodeihin

---
 .../fi/utu/tech/ooj/exercise3/Ajoneuvo.java   |  1 +
 .../java/fi/utu/tech/ooj/exercise3/Kirja.java |  4 +++
 .../utu/tech/ooj/exercise3/KirjaKokoelma.java |  4 +++
 .../fi/utu/tech/ooj/exercise3/Kirjasto.java   |  5 ++++
 .../java/fi/utu/tech/ooj/exercise3/Main.java  | 27 ++++++++++++++++---
 .../tech/ooj/exercise3/Tehtava 5 vastaukset   | 11 +++++++-
 6 files changed, 48 insertions(+), 4 deletions(-)

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 24473fc..c686aa5 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 c5b37ca..6d83839 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 9896e35..6ecb565 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 53232bd..1ef2a6d 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 bd992bb..3e4b9f2 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 a4f610f..8b79f4e 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
-- 
GitLab