Означает ли статическая типизация, что вам нужно привести переменную, если вы хотите изменить ее тип? - PullRequest
0 голосов
/ 01 марта 2009

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

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

Ответы [ 7 ]

11 голосов
/ 01 марта 2009

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

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

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

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

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

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

4 голосов
/ 01 марта 2009

В C ++ / Java нельзя изменить тип переменной.

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

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

js> x="5" <-- String
5
js> x=x*5 <-- Int
25
1 голос
/ 01 марта 2009

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

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

1 голос
/ 01 марта 2009

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

0 голосов
/ 01 марта 2009

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

Например, в 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
0 голосов
/ 01 марта 2009

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

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

0 голосов
/ 01 марта 2009

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

Например:

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 ++, чтобы добиться некоторой динамической типизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...