В чем разница между слабой типизацией, автобоксом и расширением конверсий?
Кажется, что определение слабой типизации (не путать с динамической типизацией) состоит в том, что бинарный оператор может работать, когда оба значения имеют другой тип.
Программисты Python утверждают, что Python строго типизирован, потому что 1+"hello"
потерпит неудачу вместо того, чтобы молча сделать что-то еще. Напротив, другие языки, которые обычно считаются слабо типизированными (например, PHP, JavaScript, Perl), будут молча конвертировать один или оба операнда. Например, в JavaScript, 1+"hello"
-> "1hello"
в то время как в Perl, 1+"hello"
-> 1
, но 1+"5"
-> 6
,
Теперь у меня сложилось впечатление, что Java считается строго типизированным языком, но автоматические (не) бокс и расширяющиеся преобразования, похоже, противоречат этому. Например, 1+new Integer(1)
-> 2
, hello+"1"
-> "hello1"
, 'A'+1
-> 66
, и long может быть автоматически преобразован в float, хотя обычно он усекается. Ява слабо типизирована? В чем разница между слабой типизацией, автобоксом и расширением конверсий?
1 ответ
Слабая типизация - это когда определенные преобразования и специальные полиморфизмы выполняются неявно, если компилятор / интерпретатор чувствует необходимость в этом.
Автобокс - это когда литералы и необъектные типы автоматически преобразуются в соответствующие типы объектов при необходимости. (Например, Java позволит вам вызывать методы для строкового литерала, как если бы он был строковым объектом.) Это не имеет ничего общего с системой ввода. Это на самом деле просто синтаксический сахар, чтобы не создавать объекты явно.
Расширяющиеся преобразования являются одной из форм слабой типизации. На очень строгом строго типизированном языке это было бы запрещено. Но в таких языках, как Java, это разрешено, поскольку не имеет негативных побочных эффектов. Что-то такое маленькое, как это, едва ли достаточно, чтобы больше не считать Java языком со строгой типизацией.
Java также перегружает оператор + для конкатенации строк. Это определенно особенность, наблюдаемая в слабо типизированных языках, но, опять же, недостаточно большая, чтобы называть Java слабо типизированной. (Хотя я думаю, что это действительно глупая идея.)