2009-03-01 2 views
0

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

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

+0

Casting не изменяет тип переменной. Результат каста - это новое выражение, которое неявно хранится в любом месте. – recursive

ответ

11

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

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

Эти две противоположности могут быть объединены свободно:

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

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

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

+0

Awesome. Благодарю. – 2009-03-01 19:51:25

4

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

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

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

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

Не меняет ли тип изменения? – 2009-03-01 17:23:14

+1

@Mark. Вы можете изменить тип VALUE, но не ПЕРЕМЕННЫЙ. int i = 42; // Я не могу изменить float. Однако значение i (42) может. См. Мой пример. – strager

+1

Не тип переменной. Он может изменить тип значения/выражения. –

1

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

0

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

Например:

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

1

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

Система типов не обязательно влияет на код, например. языки со статической типизацией, вывод типа и неявное преобразование (например, Scala, например) во многом похожи на языки с динамическим вводом. См. Также: What To Know Before Debating Type Systems.

0

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

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

+0

Итак, toFloat в Java не изменяет существующий объект. Я смотрю на Ruby, где вы можете сказать x = «abc», а затем x = «100» - вы сказали, что Javascript генерирует новые объекты, но я думал, что Ruby просто изменяет существующий объект на новый тип. Или я ошибаюсь? – 2009-03-01 17:37:11

0

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

В 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