Java слабо типизирован, как показывает этот пример по сравнению с python?
Я знаком с сильными и слабыми типами. Я также знаю, что Java строго типизирован. Теперь я изучаю Python, и это сильный типизированный язык. Но теперь я вижу, что python "более" строго типизирован, чем Java. пример для иллюстрации
public class StringConcat {
public static void main(String[] args) {
String s="hello ";
s+=4;
System.out.println(s);
}
}
Нет ошибок и печатает привет 4
в питоне
>>> x="hello"
>>> x+=4
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
так что этот пример демонстрирует, что python строго типизирован. если Java под капотом, делает некоторые манипуляции для преобразования int в String и делает String concat.
3 ответа
Ява все еще строго типизирована, несмотря на ваш пример. Код эквивалентен
String s = "hello ";
s = s + 4;
и Java преобразует 4
в строку, затем выполните объединение строк. Это особенность языка.
В Python, однако, вы не можете использовать +
соединять 4
к вашей строке, потому что язык не позволит себе преобразовать его в str
, Как вы указываете, Java делает это для вас под капотом.
Этот пример не доказывает, что Java не является строго типизированной. За кулисами происходит неявное преобразование строк (JLS, раздел 5.1.11).
Во-первых, происходит преобразование в ссылочный тип для создания Integer
от int
буквальный (new Integer(4)
), затем toString()
называется преобразовать его в String
для объединения.
Если вы хотите еще один забавный пример, вы можете найти во многих местах
intNumber+""
преобразовать число в строку. Программисты ленивы и не хотят писать
Integer.toString(intNumber)
И это вызывает преобразование строк И бесполезную конкатенацию строк во время выполнения.
Это не означает, что Java не является строго типизированной, просто все объекты должны иметь метод toString(), и все примитивы могут быть автоматически упакованы и распакованы в их не примитивные аналоги (int -> Integer, long -> Long и т. Д.).), которые реализуют toString(), а "+" в Java действует как конкатенация строк.