2013-05-27 12 views
9

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?

+0

Istnieją miliony przykładów, należy je uruchamiać każdego dnia podczas pisania kodu. –

+0

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ę. –

Odpowiedz

16

(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.

2

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ę.

+1

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

2

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.

1

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!

1

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ł.

Powiązane problemy