Powtórzenie – kontener generyczny
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 58 z 87.
Wyzwanie
ŁatwyZbudujmy wszechstronny system przechowywania danych, który łączy wszystko, czego nauczyłeś się o typach generycznych! Utworzysz klasę Container, która może przechowywać, pobierać i przetwarzać elementy dowolnego typu, a także metody pomocnicze demonstrujące działanie symboli wieloznacznych.
Rozmieścisz swój kod w trzech plikach:
Container.java: Utwórz klasę generycznąContainer<T>, która zarządza kolekcją elementów. Kontener powinien wewnętrznie używaćArrayList<T>do przechowywania elementów. Dodaj metodyadd(T item)do dodawania elementu,get(int index)do pobierania elementu z określonej pozycji,size()do zwracania liczby elementów orazisEmpty()do sprawdzania, czy kontener nie zawiera żadnych elementów. Dodaj również metodęgetAll(), która zwraca wewnętrzną listę.ContainerUtils.java: Utwórz klasę pomocniczą ze statycznymi metodami generycznymi działającymi na twoich kontenerach:printAll(Container<?> container)- Używa nieograniczonego symbolu wieloznacznego, aby wypisać wszystkie elementy dowolnego kontenera, po jednym w wierszu.countItems(Container<? extends Number> container)- Używa symbolu wieloznacznego z górnym ograniczeniem, aby obliczyć sumę wszystkich wartości liczbowych w kontenerze i zwrócić wynik jakodouble.addDefaults(Container<? super Integer> container)- Używa symbolu wieloznacznego z dolnym ograniczeniem, aby dodać liczby całkowite 1, 2 i 3 do dowolnego kontenera, który może przechowywać liczby całkowite.<T> T getLastOrDefault(Container<T> container, T defaultValue)- Metoda generyczna, która zwraca ostatni element w kontenerze lub wartość domyślną, jeśli kontener jest pusty.Main.java: Połącz elementy swojego generycznego systemu kontenerów! Otrzymasz trzy dane wejściowe: słowo (String), liczbę całkowitą i liczbę zmiennoprzecinkową typu double.Najpierw utwórz
Container<String>i dodaj do niego słowo dwa razy. WypiszString container:, a następnie użyjprintAll, aby wyświetlić jego zawartość.Następnie utwórz
Container<Double>i dodaj do niego wartość typu double. Wypisz pusty wiersz, a następnieNumber sum: [sum], używającsumValues.Potem utwórz
Container<Number>i wywołaj dla niegoaddDefaults. Wypisz pusty wiersz, a następnieAfter adding defaults:i użyjprintAll, aby wyświetlić zawartość.Na koniec utwórz pusty
Container<Integer>i użyjgetLastOrDefault, podając wprowadzoną przez siebie liczbę całkowitą jako wartość domyślną. Wypisz pusty wiersz, a następnieLast or default: [result].
Otrzymasz trzy dane wejściowe w następującej kolejności: słowo (String), liczbę całkowitą i liczbę zmiennoprzecinkową typu double.
To wyzwanie łączy klasy generyczne, metody generyczne, ograniczone parametry typów i wszystkie trzy rodzaje symboli wieloznacznych. Zwróć uwagę, jak każdy element pełni inną funkcję: klasa generyczna zapewnia bezpieczne typowo przechowywanie danych, symbole wieloznaczne z ograniczeniami umożliwiają elastyczne odczytywanie i zapisywanie, a metody generyczne oferują wielokrotnego użytku operacje dla różnych typów kontenerów!
Spróbuj swoich sił
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Wczytaj dane wejściowe
String word = scanner.nextLine();
int intValue = Integer.parseInt(scanner.nextLine());
double doubleValue = Double.parseDouble(scanner.nextLine());
// TODO: Utwórz Container<String> i dodaj do niego słowo dwukrotnie
// Wypisz "String container:", a następnie użyj ContainerUtils.printAll()
// TODO: Utwórz Container<Double> i dodaj do niego wartość typu double
// Wypisz pustą linię, a następnie "Number sum: [sum]", używając ContainerUtils.countItems()
// TODO: Utwórz Container<Number> i wywołaj na nim ContainerUtils.addDefaults()
// Wypisz pustą linię, a następnie "After adding defaults:" i użyj ContainerUtils.printAll()
// TODO: Utwórz pusty Container<Integer>
// Użyj ContainerUtils.getLastOrDefault() z intValue jako wartością domyślną
// Wypisz pustą linię, a następnie "Last or default: [result]"
}
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatności9Typy generyczne
Wprowadzenie do typów generycznychKlasy generyczneMetody generyczneOgraniczone parametry typówSymbole wieloznaczne (?, extends, super)Powtórzenie – kontener generycznyPoćwicz samodzielnie: Kompilator Java online