Означает ли статическая типизация, что вам нужно привести переменную, если вы хотите изменить ее тип?

StackOverflow https://stackoverflow.com/questions/600126

Вопрос

Существуют ли другие способы изменения типа переменной в статически типизированном языке, таком как Java и C++, кроме «приведения»?

Я пытаюсь выяснить, в чем заключается основное практическое различие между динамической и статической типизацией, и продолжаю находить очень академические определения.Мне интересно, что это значит с точки зрения того, как выглядит мой код.

Это было полезно?

Решение

Убедитесь, что у вас нет статического vs.динамическую типизацию путают с сильной и динамической типизацией.слабая типизация.

  • Статическая типизация:Каждая переменная, параметр метода, тип возвращаемого значения и т. д.имеет тип, известный во время компиляции, объявленный или выведенный.
  • Динамическая типизация:типы игнорируются/не существуют во время компиляции
  • Строгая типизация:каждый объект во время выполнения имеет определенный тип, и вы можете выполнять с ним только те операции, которые определены для этого типа.
  • Слабая типизация:Объекты времени выполнения либо не имеют явного типа, либо система пытается автоматически преобразовать типы там, где это необходимо.

Эти две противоположности можно свободно комбинировать:

  • Java статически и строго типизирована.
  • C статически и слабо типизирован (арифметика указателей!)
  • Ruby динамически и строго типизирован.
  • JavaScript динамически и слабо типизирован.

В целом статическая типизация означает, что компилятор улавливает множество ошибок, которые являются ошибками времени выполнения в динамически типизированном языке, но это также означает, что вы тратите много времени на беспокойство о типах, во многих случаях без необходимости (см.утиное печатание).

Строгая типизация означает, что любое преобразование между типами должно быть явным, либо посредством приведения типов, либо с помощью методов преобразования (например,преобразование строки в целое число).Это означает больше работы по типизации, но имеет то преимущество, что вы держите все под контролем, в то время как слабая типизация часто приводит к путанице, когда система выполняет какое-то неясное неявное преобразование, в результате которого вы получаете совершенно неправильное значение переменной, что приводит к хаосу в вызовах десяти методов. линия.

Другие советы

В C++/Java вы не можете изменить тип переменной.

Статическая типизация:Переменная имеет один тип, назначенный при компиляции, и он не меняется.

Динамическая типизация:Тип переменной может меняться во время выполнения, например.в JavaScript:

js> x="5" <-- String
5
js> x=x*5 <-- Int
25

Основное отличие состоит в том, что в динамически типизированных языках вы не знаете, пока не начнете использовать метод во время выполнения, существует ли этот метод.В статически типизированных языках проверка выполняется во время компиляции, и компиляция завершается неудачей, если метод не существует.

Мне интересно, что это значит с точки зрения того, как выглядит мой код.

Система типов не обязательно оказывает какое-либо влияние на то, как выглядит код, например.языки со статической типизацией, выводом типа и неявным преобразованием (например, Scala) очень похожи на динамически типизированные языки.Смотрите также: Что нужно знать перед обсуждением систем типов.

Вы не нуждаться явный кастинг.Во многих случаях неявное приведение работает.

Например:

int i = 42;
float f = i; // f ~= 42.0
int b = f;   // i == 42

class Base {
};

class Subclass : public Base {
};

Subclass *subclass = new Subclass();
Base *base = subclass;  // Legal

Subclass *s = dynamic_cast<Subclass *>(base); // == subclass.  Performs type checking.  If base isn't a Subclass, NULL is returned instead.  (This is type-safe explicit casting.)

Однако вы не можете изменить тип переменной.Однако в C++ можно использовать объединения для достижения некоторой динамической типизации.

Давайте посмотрим на Java как язык статической типизации и JavaScript для динамического интерфейса.В Java для объектов переменная является ссылкой на объект.Объект имеет тип времени выполнения, а ссылка имеет тип.Тип ссылки должен совпадать с типом объекта среды выполнения или одного из его предков.Вот как работает полиморфизм.Вам нужно выполнить приведение, чтобы подняться по иерархии ссылочного типа, но не вниз.Компилятор обеспечивает выполнение этих условий.В таком языке, как JavaScript, ваша переменная — это просто переменная.Вы можете указать ему любой объект, который вам нужен, и вы не узнаете его тип, пока не проверите.

Однако для преобразований в Java существует множество методов, таких как toInteger и toFloat, которые выполняют преобразование и генерируют объект нового типа с тем же относительным значением.В JavaScript тоже есть методы преобразования, но они тоже генерируют новые объекты.

На самом деле ваш код не должен сильно отличаться, независимо от того, используете ли вы статически типизированный язык или нет.Тот факт, что вы можете изменить тип данных переменной в динамически типизированном языке, не означает, что это хорошая идея.

Например, в VBScript венгерская нотация часто используется для указания предпочтительного типа данных переменной.Таким образом, вы можете легко определить, смешивает ли код типы.(Изначально венгерская нотация использовалась не так, но она весьма полезна.)

Придерживаясь одного и того же типа данных, вы избегаете ситуаций, когда трудно сказать, что на самом деле делает код, и ситуаций, когда код просто не работает должным образом.Например:

Dim id
id = Request.QueryString("id") ' this variable is now a string
If id = "42" Then
  id = 142 ' sometimes turned into a number
End If
If id > 100 Then ' will not work properly for strings

Используя венгерскую нотацию, вы можете обнаружить код, который смешивает типы, например:

lngId = Request.QueryString("id") ' putting a string in a numeric variable

strId = 42 ' putting a number in a string variable
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top