niekompatybilne typy: int nie może zostać przekonwertowany na wartość logiczną
Interesuje mnie, dlaczego C na to pozwala, a java nie. Dlatego interesuje mnie system typów języka, a konkretnie jego siła.
Twoje pytanie składa się z dwóch części:
Dlaczego Java nie konwertować int
do boolean
?
Sprowadza się to do tego, że Java ma być jak najbardziej jawna. Jest bardzo statyczny, bardzo „prosto w twarz” dzięki systemowi typów. Rzeczy, które są automatycznie rzutowane na czcionkę w innych językach, nie są tak w Javie. Ty też musisz pisać int a=(int)0.5
. Konwersja float
na int
utraciłaby informacje; to samo, co konwersja int
na, boolean
i dlatego byłaby podatna na błędy. Ponadto musieliby określić wiele kombinacji. Jasne, te rzeczy wydają się oczywiste, ale zamierzały popełnić błąd po stronie ostrożności.
Aha, w porównaniu z innymi językami, Java była bardzo dokładna w specyfikacji, ponieważ kod bajtowy nie był tylko wewnętrznym szczegółem implementacji. Musieliby dokładnie sprecyzować wszelkie interakcje. Ogromne przedsięwzięcie.
Dlaczego if
nie akceptuje innych typów niż boolean
?
if
można idealnie zdefiniować jako pozwalające na inne typy niż boolean
. Może mieć definicję, która mówi, że następujące są równoważne:
true
int != 0
String
z .length>0
- Wszelkie inne odwołania do obiektów, które nie są
null
(a nie Boolean
mają wartości false
).
- Lub nawet: każde inne odwołanie do obiektu, które nie jest
null
i którego metoda Object.check_if
(wymyślona przeze mnie na tę okazję) zwraca true
.
Nie zrobili tego; nie było takiej potrzeby i chcieli, aby był jak najbardziej solidny, statyczny, przezroczysty, łatwy do odczytania itp. Brak ukrytych funkcji. Ponadto implementacja byłaby dość złożona, jestem pewien, że musiałbym przetestować każdą wartość dla wszystkich możliwych przypadków, więc wydajność mogła również mieć niewielki wpływ (Java na komputerach tego dnia była powolna; pamiętaj, że tam nie było żadnych kompilatorów JIT z pierwszymi wydaniami, przynajmniej nie na komputerach, z których wtedy korzystałem).
Głębszy powód
Głębszym powodem może być fakt, że Java ma swoje prymitywne typy, dlatego system typów jest rozdarty między obiektami a prymitywami. Może gdyby tego uniknęli, sprawy potoczyłyby się inaczej. Zgodnie z regułami podanymi w poprzedniej sekcji musieliby jednoznacznie zdefiniować prawdziwość każdego pojedynczego elementu pierwotnego (ponieważ elementy podstawowe nie dzielą superklasy , a elementy podstawowe nie są dobrze zdefiniowane null
). To szybko zamieniłoby się w koszmar.
Perspektywy
Cóż, w końcu może to tylko preferencja projektantów języków. Każdy język wydaje się kręcić własną drogą ...
Na przykład Ruby nie ma prymitywnych typów. Wszystko, dosłownie wszystko, jest przedmiotem. Mają bardzo łatwy czas, upewniając się, że każdy obiekt ma określoną metodę.
Ruby szuka prawdziwości we wszystkich typach przedmiotów, które możesz na nią rzucić. Co ciekawe, nadal nie ma boolean
typu (ponieważ nie ma prymitywów), a także nie ma Boolean
klasy. Jeśli zapytasz, jaką klasę true
ma wartość (łatwo dostępna true.class
), otrzymasz TrueClass
. Ta klasa faktycznie ma metody, a mianowicie 4 operatory dla booleanów ( | & ^ ==
). Tutaj if
uważa , że jego wartość falsey jest wtedy i tylko wtedy, gdy jest to false
albo nil
( null
Ruby). Wszystko inne jest prawdą. Tak więc 0
lub ""
obie są prawdą.
Byłoby dla nich trywialne stworzenie metody, Object#truthy?
którą można by wdrożyć dla każdej klasy i zwrócić indywidualną prawdę. Na przykład, String#truthy?
mógł zostać zaimplementowany, aby był prawdziwy dla niepustych ciągów znaków lub w ogóle. Nie zrobili tego, chociaż Ruby jest antytezą Javy w większości działów (dynamiczne pisanie kaczek z mixinem, ponowne otwieranie klas i tak dalej).
Co może być zaskakujące dla programisty Perla, który jest przyzwyczajony do $value <> 0 || length($value)>0 || defined($value)
bycia prawdomównym. I tak dalej.
Wpisz SQL zgodnie z konwencją, że null
wewnątrz dowolnego wyrażenia automatycznie powoduje, że jest ono fałszywe, bez względu na wszystko. Tak (null==null) = false
. W Ruby (nil==nil) = true
. Szczęśliwe czasy.