Czy ktoś mógłby wyjaśnić, dlaczego kiedykolwiek używałbyś rozszerzania lub zawężania konwersji? Dużo o nich czytałem, ale nikt nigdy nie dał mi praktycznego przykładu. Dzięki!Prawdziwa aplikacja do rozszerzania/zwężania?
Odpowiedz
(Java) Konwersje na powiększanie i zwężanie mają do czynienia z konwersją między powiązanymi typami. Weźmy na przykład relację między klasą abstrakcyjną (super) a jej podklasą (potomną); użyjmy klasy java.lang.Number (streszczenie) i bezpośredniej podklasy Integer. Tutaj mamy:
(superclass) Number
__________/\__________
/ | | \
(concrete subclasses) Integer Long Float Double
Poszerzenie konwersji: występuje, jeśli weźmiemy szczególnego rodzaju (podklasa) i próba przypisania go do konkretnego typu (mniej nadklasy).
Integer i = new Integer(8);
Number n = i; // this is widening conversion; no need to cast
Zawężenie konwersji: pojawia się, gdy bierzemy mniej konkretny typ (nadrzędnej) i próbować przypisać go do bardziej konkretnego typu (podklasa), która wymaga wyraźnej odlew.
Number n = new Integer(5); // again, widening conversion
Integer i = (Integer) n; // narrowing; here we explicitly cast down to the type we want - in this case an Integer
Są pewne kwestie, które trzeba mieć świadomość, takich jak ClassCastExceptions:
Integer i = new Integer(5);
Double d = new Double(13.3);
Number n;
n = i; // widening conversion - OK
n = d; // also widening conversion - OK
i = (Integer) d; // cannot cast from Double to Integer - ERROR
// remember, current n = d (a Double type value)
i = (Integer) n; // narrowing conversion; appears OK, but will throw ClassCastException at runtime - ERROR
Jeden sposób obsłużyć to jest użycie oświadczenie if
z instanceof
słów kluczowych:
if(n instanceof Integer) {
i = (Integer) n;
}
Dlaczego chcesz tego użyć? Powiedzmy, że tworzysz hierarchię personelu dla jakiegoś programu i masz ogólną nadklasę o nazwie "Osoba", która przyjmuje imię i nazwisko jako parametry, i podklasy "Uczeń", "Nauczyciel", "Sekretarz" itp. Tutaj możesz początkowo utworzyć osobę ogólną i przypisać ją (poprzez dziedziczenie) do, powiedzmy, Studenta, który będzie miał dodatkowe pole zmiennych dla zestawu studenID w jego konstruktorze. Można użyć jednej metody, które ma bardziej ogólne (szersze) RODZAJ jako parametr i obsługiwać wszystkie podklasy tego typu, a także:
public static void main(String[] args) {
Person p = new Student("John", "Smith", 12345);
printInfo(p);
}
// this method takes the wider Person type as a parameter, though we can send it a narrower type such as Student if we want
public static void printInfo(Person p) {
System.out.println("First: " + p.getFirstName());
System.out.println("Last: " + p.getLastName());
if (p instanceof Student) {
System.out.println((Student)p).getStudentID()); // we cast p to Student with Narrow Conversion which allows us to call the getStudentID() method; only after ensuring the p is an instance of Student
}
}
ja sobie z tego nie może być idealnym sposobem, aby obsłużyć rzeczy, ale dla ze względu na demonstrację myślałem, że to pokazuje niektóre z możliwości.
Jeśli jakiś kod zwróci wartość int
zawierającą wartość true/false, można ją skrócić samodzielnie do wartości bool
, która jest tym, co właściwie reprezentuje.
Możesz także zrobić odwrotnie.
Możesz poszerzyć zakres char
do int
, aby wykonać pewne porównania z wartościami ASCII.
Możesz pobrać instancję Dog
i rozszerzyć ją do IAnimal
, aby przekazać ją do funkcji.
można skrócić IAnimal
do Dog
gdy wiesz, rodzaj zwierzęcia w List<IAnimal>
w zakładzie lub w innym miejscu bez względu na przyczynę.
W java nie można przekonwertować int na wartość boolowską, co jest bardziej specyficzną cechą, która spowodowała tyle błędów, że nie jest już tak zabawna. – Voo
Konwersji niejawnych używa się do matematyki z wartościami liczbowymi różnych typów. Na przykład, jeśli now()
zwraca znacznik czasu w sekundach, jak długo:
long t = now()
long nextMinute = t + 60
masz zrobić niejawna konwersja poszerzenie 60 (wew) Do długo tak można go dodać do t
. Możliwość wykonywania takich konwersji znacznie ułatwia kodowanie.
Jednym z kanonicznych przykładów poszerzania i zawężania konwersji jest sposób działania niektórych bibliotek I/O plików. Często biblioteka przetwarzania plików będzie miała funkcję/metodę, która odczyta pojedynczy znak z pliku. Jeśli istnieje znak do odczytania, funkcja powinna zwrócić ten znak, a jeśli nie pozostały żadne znaki, powinna zwrócić wartość wartownika EOF, aby to zasygnalizować.
ponieważ każda postać może pojawić się w pliku, zwykle funkcja/metoda miałaby ten podpis:
int readCharacter();
Tutaj funkcja zwraca int
która posiada wartość char
jeśli znak został odczytany i który posiada EOF
jako wartownik inaczej. EOF
jest zwykle wybierany jako liczba całkowita, która jest zbyt duża do przechowywania w jednostce char
. W ten sposób możesz to zrobić:
while (true) {
int ch = readCharacter();
if (ch == EOF) break;
char actualCharValue = (char) ch;
/* process actualCharValue here */
}
Mam nadzieję, że to pomoże!
Weź to ...
konwersji - specjalistyczne -> uogólnione, to znane jest jako poszerzenie, kiedy stają się bardziej ogólne.
Takich jak chirurg -> Medico. W takim przypadku nie potrzebujesz rzucania. Ponieważ chirurg jest domyślnie Medico. Jest więc naturalne, że chirurg może wykonać wszystkie te rzeczy, które może wykonać Medico.
Chociaż z drugiej strony, konwersji - Ogólny -> Specjalistyczny, to znane jest jako zwężenie, kiedy stają się coraz bardziej wyspecjalizowane.
Takich jak Medico -> Chirurg. W tym przypadku musisz dodać rzutowanie. Ponieważ medico może być chirurgiem, lekarzem lub pielęgniarką. Pomyśl o tym, jeśli poprosisz pielęgniarkę o operowanie na tobie ...
Okropne, prawda ???
Mam nadzieję, że masz pomysł.
- 1. Prawdziwa bezgłowa przeglądarka
- 2. Oczekiwano, że odpowiedź jest prawdziwa?
- 3. prawdziwa projekcja izometryczna z opengl
- 4. Jaka jest prawdziwa zaleta parametru typu upstream?
- 5. Jaka jest prawdziwa korzyść z obiektywów?
- 6. jeśli instrukcja w javascript zawsze jest prawdziwa
- 7. YUI - Czy szerokość elementu jest prawdziwa?
- 8. Każda prawdziwa różnica pomiędzy formatami plików czcionek
- 9. Generic cukier syntaktyczny lub prawdziwa poprawa
- 10. Aplikacja do samodzielnej aktualizacji
- 11. Jaka jest prawdziwa korzyść z trybu zwolnienia dla ASP.Net
- 12. odtwarzać klip dźwiękowy, gdy instrukcja php/mysql if jest prawdziwa?
- 13. Narzędzia PHP dla Visual Studio, prawdziwa alternatywa czy nie?
- 14. Geolokacja HTML5 enableHighAccuracy Prawdziwa, fałszywa lub najlepsza opcja?
- 15. Jak zrobić is_arithmetic <myClass> :: wartość jest prawdziwa?
- 16. Prawdziwa (lub ukryta) różnica między impulsem startowym Twittera i Angular.js
- 17. Jak wykryć wykrytą twarz jest prawdziwa lub fałszywa
- 18. Upewnij się, że dokładnie jedna boolean danej listy jest prawdziwa?
- 19. Gitk: Domyślnie opcja "Ignore space change" jest prawdziwa
- 20. Jaka jest prawdziwa różnica między słownikiem a tabelą skrótu?
- 21. Aplikacja Matplotlib Crashing tkinter Aplikacja
- 22. Aplikacja do przeglądania stron internetowych/interfejsu
- 23. Aplikacja Android do wypełnienia formularza PDF
- 24. aplikacja do projektu nie jest zainstalowana
- 25. Aplikacja konsolowa do komunikacji z usługą Windows
- 26. Aplikacja do dyktowania za pomocą Sphinx4
- 27. Aplikacja do Androida z włączoną synchronizacją online
- 28. Aplikacja internetowa Azure przekierowania http do https
- 29. Aplikacja wykorzystana do awarii MapKit na iOS6
- 30. Przejdź do ekranu aplikacji Moja aplikacja app
Istnieją miliony przykładów, należy je uruchamiać każdego dnia podczas pisania kodu. –
Jestem studentką i przez kilka lat studiowałem programowanie i nigdy nie wpadłem na to wcześniej, przepraszam. Gdybym się na to natknął, nie byłoby sensu zadawać tego pytania, ale dzięki za krytykę. –