Avatar billede dresen Nybegynder
10. november 2005 - 20:16 Der er 5 kommentarer

forvirret over generics

Hej

Jeg har som overskriften informerer om et problem angående generics.

Jeg har et spørgsmål der går på følgende:

Declare a List<? extends Person> lep. 
0.    How can you initialize the lep variable? Why can you not         
        write "new ArrayList<? extends Person>()"?
1.    Can you make the assignment lpp = lp?
2.    Can you make the assignment lpp = ls?
3.    Can you insert elements into lpp? Why (not)?
4.    Can you get elements from lpp?

Det står ikke helt klart for mig, hvordan det hænger sammen, når extends introduceres i de to brackets, jeg håber der er en venlig sjæl der kan hjælpe mig til et overblik.

Hvilken rolle har spørgsmålstegnet?!

På forhånd tak!!!

Klassen jeg opererer med ser ud som følger:

/* GenericTester.java
* Created on 2005-11-10
*/
package exercise02;

import java.util.*;

class Person {
    String name;
    Integer birthYear;
    Person(String name, int birth){
        this.name = name;
        birthYear = birth; // boxing
    }
    Integer age(){
        return 2004-birthYear; // unboxing & boxing
    }
}
class Student extends Person{
    String university;
    Student(String name, int birth){
        super(name, birth);
        university = "ITU";
    }
    Student(String name, int birth, String university){
        super(name, birth);
        this.university = university;
    }
}

public class GenericTester {
   
    public static void main(String[] args) {
       
       
        // 2.1
        List<Person> lp = new ArrayList <Person>();
       
        // 2.2
       
        // list.add("String");
       
        // error message:
        // The method add(Person) in the type List<Person>
        // is not applicable for the arguments (String)

       
        // 2.3
        lp.add(new Person("John Doe", 1873));
        lp.add(new Student("Hasse Backe", 1958));
       
        // 2.4
        Person p;
        Student s;
       
        // 2.4.a -     lp.get(1) returns a Person object, because the lists type parameter is Persons,
        //             thus only references to class Person and its subclasses can be put into the list
        //            and only Person references can be fetched from the list
        p = lp.get(1);
       
        // 2.4.b
        //     this produces an exception because a student reference is not applicable with
        //     a Person reference unless the down cast has been ensured by a type cast
        // s = lp.get(1);
       
        // 2.4.c
        s = (Student)lp.get(1); // this works because of the type cast
       
        // 2.4.d
        // Generic methods are good because they allow us to write generic
        // code and enables type checking at compile time instead of run time.
        // This example only shows the power of type checking at compile time.
       
       
        // 2.5
        List <Student> ls = new ArrayList <Student>();
       
        // 2.5.2
        //ls = lp;
        // exceotion: Type mismatch: cannot convert from List<Person> to List<Student>
       
        // 2.5.3
        // The assignment is illegal because of the difference in type parameters
       
        // 2.5.4
        //lp = ls;
        // exception: Type mismatch: cannot convert from List<Student> to List<Person>
        // The assignment is illegal because of the difference in type parameters
       
       
        // 2.6
       
        List <? extends Person> lep; // = new ArrayList <StreetEntertainer extends Person>();
   
       
       
    }
   
}
Avatar billede arne_v Ekspert
10. november 2005 - 20:23 #1
jeg kan faktisk godt forstå din forundring

simpel brug af generics er ret nem at forstå, men avanceret brug kan være meget kryptisk

en pre Java 1.5 List eller en List<Object> er bare en list af hvad som helst

List<String> er en liste hvor alle objekter er String

det er til at forstå

List<? extends Person> er en liste af objekter af klasser som har det tilfælles at de arver fra Person

altså en mellem ting

man kan putte forskellige typer i listen, men de har alle det tilfælles at de
har arvet fra Person og man kan derfor assigne det man henter ud til en Person
Avatar billede arne_v Ekspert
10. november 2005 - 20:30 #2
og det er noget vrøvl
Avatar billede arne_v Ekspert
10. november 2005 - 20:35 #3
ArrayList<basisklasse> kan indeholde forskellige typer men

List<? extends basisklasse> kan pege på ArrayList<subklasse>
Avatar billede arne_v Ekspert
10. november 2005 - 20:45 #4
package november;

import java.util.*;

public class GenericGenerics {
    public static void main(String[] args) {
        List<Integer> lst1 = new ArrayList<Integer>();
        lst1.add(77);
        lst1.add(117);
        List<String> lst2 = new ArrayList<String>();
        lst2.add("77");
        lst2.add("117");
        List<Comparable> lst3 = new ArrayList<Comparable>();
        lst3.add(77);
        lst3.add("117");
        test1(lst1);
        //compiler ikke//test2(lst1);
        test1(lst2);
        //compiler ikke//test2(lst2);
        //runtime error//test1(lst3);
        //runtime error//test2(lst3);
    }
    public static void test1(List<? extends Comparable> lst) {
        System.out.println(lst.get(0).compareTo(lst.get(1)));
    }
    public static void test2(List<Comparable> lst) {
        System.out.println(lst.get(0).compareTo(lst.get(1)));
    }
}
Avatar billede arne_v Ekspert
31. december 2005 - 15:00 #5
Tid at få afsluttet her ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester