Przekazanie referencji obiektu - pytanie

0

Witam wszystkich forumowiczów.

Mam do Was pytanie związane z nauką Javy. Obecnie studiuję książkę "Java w 21 dni" autorstwa Rogers Cadenhead. Jakiś czas temu natknąłem się na temat przekazywania referencji obiektów do tablicy. Wszystko dla mnie jest zrozumiałem poza jednym. Dlaczego podczas wywoływania metody zwracającej referencję z tablicy musimy stosować nawias z nazwą klasy (Item) z której to obiekt został utworzony?

 public Item getItem(int i) {
        return (Item) catalog.get(i);
 }

Dziękuję za jakiekolwiek odpowiedz. Pozdrawiam

0

Jak wygląda deklaracje tablicy catalog?
Najlepiej cały kod wklej :)

0

Dziękuję za odpowiedź, wklejam kod wszystkich trzech klas:

public class Storefront {
    private LinkedList catalog = new LinkedList();

    public void addItem(String id, String name, String price,
        String quant) {

        Item it = new Item(id, name, price, quant);

        catalog.add(it);         
    }

    public Item getItem(int i) {
        return (Item) catalog.get(i);
    }
    
   

    public int getSize() {
        return catalog.size();
    }
   

    public void sort() {
        Collections.sort(catalog);
    }
}
public class Item implements Comparable {
    private String id;
    private String name;
    private double retail;
    private int quantity;
    private double price;

    Item(String idIn, String nameIn, String retailIn, String qIn) {
        id = idIn;
        name = nameIn;
        retail = Double.parseDouble(retailIn);
        quantity = Integer.parseInt(qIn);

        if (quantity > 400)
            price = retail * .5D;
        else if (quantity > 200)
            price = retail * .6D;
        else
            price = retail * .7D;
        price = Math.floor( price * 100 + .5 ) / 100;
    }

    public int compareTo(Object obj) {
        Item temp = (Item) obj;
        if (this.price < temp.price) {
            return 1;
        } else if (this.price > temp.price) {
            return -1;
        }
        return 0;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public double getRetail() {
        return retail;
    }

    public int getQuantity() {
        return quantity;
    }

    public double getPrice() {
        return price;
    }
}
public class GiftShop {
   public static void main(String[] arguments) {
        Storefront store = new Storefront();
        store.addItem("C01", "KUBEK", "9.99", "150");
        store.addItem("C02", "DUŻY KUBEK", "12.99", "82");
        store.addItem("C03", "PODKĹADKA", "10.49", "800");
        store.addItem("D01", "KOSZULKA", "16.99", "90");
        store.sort();

        for (int i = 0; i < store.getSize(); i++) {
            Item show = (Item) store.getItem(i);
            System.out.println("\nIdentyfikator elementu: " + show.getId() +
                "\nNazwa: " + show.getName() +
                "\nCena sprzedaĹĽy: " + show.getRetail() + " zł‚" +
                "\nCena: " + show.getPrice() + " zł‚" +
                "\nSztuk: " + show.getQuantity());
        }
        
      
    }
}
5

Wyjaśnienie. Książka pochodzi z antykwariatu i opowiada o pradawnej javie. Wersja najpóźniej 1.4 - czyli rok 2004.
Tak teraz nikt w javie raczej ( w ten sposób ) nie pisze.
O ile nie chcesz zostać archeologiem, tylko po prostu programistą to znajdź coś nowszego.

0
jarekr000000 napisał(a):

Wyjaśnienie. Książka pochodzi z antykwariatu i opowiada o pradawnej javie. Wersja najpóźniej 1.4 - czyli rok 2004.
Tak teraz nikt w javie raczej ( w ten sposób ) nie pisze.
O ile nie chcesz zostać archeologiem, tylko po prostu programistą to znajdź coś nowszego.

Dziękuję za odpowiedź. To może trochę inaczej.
Dlaczego kod

public Item getItem(int i) {
       return catalog.get(i);
   }

zgłasza błąd.

Przy kodzie:

 public Item getItem(int i) {
        return (Item) catalog.get(i);
    }

wszystko się kompiluje.

Różnicą w tych dwóch podanych kodach jest (Item) zawarte przed catalog.get(i);
Przecież w instrukcji return catalog.get(i); zwracamy referencję obiektu stworzonego na podstawie Item, to dlaczego kompilator zgłasza błąd i wymusza na programiście dodanie (Item) przez tą instrukcją?

0
addamos91 napisał(a):
jarekr000000 napisał(a):

Wyjaśnienie. Książka pochodzi z antykwariatu i opowiada o pradawnej javie. Wersja najpóźniej 1.4 - czyli rok 2004.
Tak teraz nikt w javie raczej ( w ten sposób ) nie pisze.
O ile nie chcesz zostać archeologiem, tylko po prostu programistą to znajdź coś nowszego.

Dziękuję za odpowiedź. To może trochę inaczej.
Dlaczego kod

public Item getItem(int i) {
       return catalog.get(i);
   }

zgłasza błąd.

Przy kodzie:

 public Item getItem(int i) {
        return (Item) catalog.get(i);
    }

wszystko się kompiluje.

Różnicą w tych dwóch podanych kodach jest (Item) zawarte przed catalog.get(i);
Przecież w instrukcji return catalog.get(i); zwracamy referencję obiektu stworzonego na podstawie Item, to dlaczego kompilator zgłasza błąd i wymusza na programiście dodanie (Item) przez tą instrukcją?

Kolekcje w Javie przed 5 przechowują i zwracają referencje typu Object. (Polimorfizm) Musisz zrzutować referencje na dół(downcasting). Przy pierwszej definicji metody zwracasz Object, a nie Item, dlatego kompilator słusznie się burzy. Drugie rzutowanie w klasie która wywołuje tą metodę już jest redundantne.

Nigdzie raczej nie stosuje się Javy sprzed 5. Wprowadziłą generyki(lub, jak to Helion, o zgrozo nazwał "typy ogólne" xd), które zmieniają postać rzeczy. I to było z 15 lat temu.

0
addamos91 napisał(a):
jarekr000000 napisał(a):

Wyjaśnienie. Książka pochodzi z antykwariatu i opowiada o pradawnej javie. Wersja najpóźniej 1.4 - czyli rok 2004.
Tak teraz nikt w javie raczej ( w ten sposób ) nie pisze.
O ile nie chcesz zostać archeologiem, tylko po prostu programistą to znajdź coś nowszego.

Dziękuję za odpowiedź. To może trochę inaczej.
Dlaczego kod

public Item getItem(int i) {
       return catalog.get(i);
   }

zgłasza błąd.

Przy kodzie:

 public Item getItem(int i) {
        return (Item) catalog.get(i);
    }

wszystko się kompiluje.

Różnicą w tych dwóch podanych kodach jest (Item) zawarte przed catalog.get(i);
Przecież w instrukcji return catalog.get(i); zwracamy referencję obiektu stworzonego na podstawie Item, to dlaczego kompilator zgłasza błąd i wymusza na programiście dodanie (Item) przez tą instrukcją?

Ponieważ powinno być List<Item> list = new LinkedList<>(); lub LinkedList<Item> list = new LinkedList<>();
Kup ksiązke o conajmniej Javie 8...
Jaką obecnie ksiązke masz?

0
scibi92 napisał(a):
addamos91 napisał(a):
jarekr000000 napisał(a):

Wyjaśnienie. Książka pochodzi z antykwariatu i opowiada o pradawnej javie. Wersja najpóźniej 1.4 - czyli rok 2004.
Tak teraz nikt w javie raczej ( w ten sposób ) nie pisze.
O ile nie chcesz zostać archeologiem, tylko po prostu programistą to znajdź coś nowszego.

Dziękuję za odpowiedź. To może trochę inaczej.
Dlaczego kod

public Item getItem(int i) {
       return catalog.get(i);
   }

zgłasza błąd.

Przy kodzie:

 public Item getItem(int i) {
        return (Item) catalog.get(i);
    }

wszystko się kompiluje.

Różnicą w tych dwóch podanych kodach jest (Item) zawarte przed catalog.get(i);
Przecież w instrukcji return catalog.get(i); zwracamy referencję obiektu stworzonego na podstawie Item, to dlaczego kompilator zgłasza błąd i wymusza na programiście dodanie (Item) przez tą instrukcją?

Ponieważ powinno być List<Item> list = new LinkedList<>(); lub LinkedList<Item> list = new LinkedList<>();
Kup ksiązke o conajmniej Javie 8...
Jaką obecnie ksiązke masz?

Java w 21 dni - Rogers Cadenhead, Wydanie VII

0

@addamos91
Ok, no w sumie wspominałeś. Na której stronie jesteś? Bo z tego co widze ta ksiązka ma kijowy rozkład materiału, generyki sa za późno...
Polecam taką ksiązke:
https://helion.pl/ksiazki/java-podstawy-wydanie-x-cay-s-horstmann,javp10.htm#format/d
Chociaż najlepiej po angielsku, bo tłumaczenia książek do Javy dają raka...

I nie cytuj całego posta jeśli masz go powyżej!

0

Aktualnie jestem na 173 stronie.

Dziękuję za odpowiedzi, Scibi92 sprawdzę tą książkę. Pozdrawiam

0
addamos91 napisał(a):

Dlaczego podczas wywoływania metody zwracającej referencję z tablicy musimy stosować nawias z nazwą klasy (Item) z której to obiekt został utworzony?

Ponieważ, nie wiem dlaczego, ktoś zadeklarował LinkedListę o tak
private LinkedList catalog = new LinkedList();
i skąd ta LinkedLista ma wiedzieć jakiego typu ma elementy? A więc ona tego nie wie - możesz tam wrzucić dowolnego typu Object. A jako że twój get napisałeś tak że ma on zawracać Item no to musisz ten Object zrzutować (to się może oczywiście wysypać jeśli to co włożyłeś to nie był Item).

Powinno być tak (przykład dla String)
LinkedList<String> llistobj = new LinkedList<String>();

0

Czyli przy deklaracji np. LinkedList, ArrayList wymagane jest podanie jakiego typu obiekty będzie ta tablica przechowywać? Czy jest to obecnie reguła stosowana w programowaniu w Javie?

0
addamos91 napisał(a):

Czyli przy deklaracji np. LinkedList, ArrayList wymagane jest podanie jakiego typu obiekty będzie ta tablica przechowywać? Czy jest to obecnie reguła stosowana w programowaniu w Javie?

Tak, nazywa się to typy generyczne. Wszyscy tak robią. Tamten model był słaby bo powodował że przy zrzutowaniu na niewłaściwy typ rzucany był wyjątek w runtime. Noi można było w jednej kolekcji trzymać wszystko, co wprowadzało bajzel.
6 wprowadziła też tak zwany operator diamentowy do generyków - polecam poczytać, i ogólnie o generykach wszystko.
Więc w sumie każdy robi tak List<String> = new ArrayList<>()

1 użytkowników online, w tym zalogowanych: 0, gości: 1