Changeset 192 in Java_Quellcode_SOOP_Vorlesung


Ignore:
Timestamp:
Jan 18, 2016, 10:16:26 AM (9 years ago)
Author:
tr
Message:

Generics überarbeitet

Location:
generics
Files:
1 added
1 deleted
2 edited
2 copied
2 moved

Legend:

Unmodified
Added
Removed
  • generics/Box.java

    r188 r192  
    11package eu.hsrw.tr.prog.vl.generics;
    22
    3 public class ObjectBox {
     3public class Box {
    44   
    55    private Object value;
    66   
    7     public Object getValue() {
     7    public Box() {}
     8   
     9    public Box(Object value) {
     10        this.value = value;
     11    }
     12   
     13    public Object get() {
    814        return this.value;
    915    }
    1016   
    11     public void setValue(Object value) {
     17    public void set(Object value) {
    1218        this.value = value;
    1319    }
  • generics/BoxMain.java

    r188 r192  
    11package eu.hsrw.tr.prog.vl.generics;
    22
    3 public class ObjectBoxMain {
     3public class BoxMain {
    44
    55    public static void main(String[] args) {
    6         ObjectBox b = new ObjectBox();
    7        
    8         b.setValue("Hallo");
    9        
    10         String s = (String) b.getValue();
    11        
     6        Box b = new Box();
     7
     8        b.set("Hallo");
     9        String s = (String) b.get();
    1210        System.out.println(s);
    13        
    14         b.setValue(42);
    15        
    16         int x = (Integer) b.getValue();
    1711
     12        b.set(42);
     13        int x = (Integer) b.get();
    1814        System.out.println(x);
    1915
    20         ObjectBoxSub obs = new ObjectBoxSub();
    21        
    22         obs.setValue("Java");
    23        
     16        Regal r = new Regal();
     17        r.leftBox = new Box("hallo");
     18        r.rightBox = new Box(42);
     19        // Wir müssen wissen, welcher Typ in welcher Box des Regals liegt.
     20        s = (String) r.leftBox.get();
     21        x = (Integer) r.rightBox.get();
     22
    2423        StringBox sb = new StringBox();
    25        
    26         sb.setValue("Hallo SB");
    27        
    28         System.out.println(sb.getValue());     
     24        sb.set("Hallo StringBox");
     25        System.out.println(sb.get());
     26
     27        IntBox ib = new IntBox();
     28        // Warum funktioniert das?
     29        // Es wird die überladene Methode set() aus Box aufgerufen
     30        // --> unerwünschtes Verhalten, da der falsche Typ gespeichert werden
     31        // kann
     32        ib.set("Hallo IntBox");
     33        // Jetzt wird die Methode set() aus IntBox aufgerufen
     34        ib.set(42);
     35        // Die Ausgabe funktioniert, da die Methode Box.get() Object liefert und die
     36        // toString()-Methode den korrekten int-Wert ausgibt (Autoboxing).
     37        System.out.println(ib.get());
     38        // Das funktioniert nicht mehr, weil die Typen nicht kompatibel sind
     39        // (Object und int)
     40        int y = 10;
     41        /*
     42         * Funktioniert nicht: int z = ib.get() + y;
     43         */
    2944    }
    3045}
  • generics/GenericBox.java

    r188 r192  
    11package eu.hsrw.tr.prog.vl.generics;
    22
    3 public class Box<T> {
     3public class GenericBox<T> {
    44
    55    private T value;
    66   
    7     public void setValue(T value) {
     7    public void set(T value) {
    88        this.value = value;
    99    }
    1010   
    11     public T getValue() {
     11    public T get() {
    1212        return this.value;
    1313    }
  • generics/GenericBoxMain.java

    r188 r192  
    11package eu.hsrw.tr.prog.vl.generics;
    22
    3 public class BoxMain {
     3public class GenericBoxMain {
    44
    55    public static void main(String[] args) {
    6         Box<Integer> b = new Box<Integer>();
     6        GenericBox<Integer> b = new GenericBox<Integer>();
    77       
    8         b.setValue(2);
     8        b.set(2);
    99       
    1010        Integer i = 3;
     
    1212        int x = i;
    1313       
    14         b.setValue(x);
     14        b.set(x);
    1515       
    1616        System.out.println(b);
  • generics/IntBox.java

    r188 r192  
    11package eu.hsrw.tr.prog.vl.generics;
    22
    3 public class IntBox extends ObjectBox {
    4     public int getiValue() {
    5         return ((Integer) getValue()).intValue();
     3public class IntBox extends Box {
     4
     5    // Hier funktioniert der Rückgabetyp int NICHT, weil int KEINE Unterklasse
     6    // von Object ist. In der Oberklasse hat get() den Rückgabetyp Object. Daher
     7    // muss die Methode zum Auslesen des Boxinhalts einen anderen Namen
     8    // erhalten. Wir wählen getInt(), jeder andere Name ist auch möglich.
     9/*  Funktioniert nicht:
     10    public int get() {
     11        return ((Integer) super.get()).intValue();
     12    }
     13*/
     14    public int getInt() {
     15        return ((Integer) super.get()).intValue();
    616    }
    717
    8     public void setValue(int i) {
    9         super.setValue(new Integer(i));
     18    public void set(int i) {
     19        super.set(new Integer(i));
    1020    }
    1121}
  • generics/StringBox.java

    r188 r192  
    11package eu.hsrw.tr.prog.vl.generics;
    22
    3 public class StringBox extends ObjectBox { 
    4     public String getValue() {
    5         return (String) (super.getValue());
     3public class StringBox extends Box {
     4   
     5    // Hier funktioniert der Rückgabetyp String, weil String eine Unterklasse
     6    // von Object ist. In der Oberklasse hat get() den Rückgabetyp Object.
     7    public String get() {
     8        return (String) (super.get());
    69    }
    7    
    8     public void setValue(String s) {
    9         super.setValue(s);
     10
     11    public void set(String s) {
     12        super.set(s);
    1013    }
    1114}
Note: See TracChangeset for help on using the changeset viewer.