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 действует как конкатенация строк.

Другие вопросы по тегам