静态类型是否意味着如果要更改其类型,则必须转换变量?

时间:2009-03-01 17:18:10

标签: variables types dynamic-languages static-typing

除了'cast'之外,还有其他方法可以在Java和C ++等静态类型语言中更改变量的类型吗?

我正在试图找出动态和静态类型之间在实践中的主要区别,并继续寻找非常学术性的定义。我想知道我的代码是什么意思。

7 个答案:

答案 0 :(得分:11)

确保您不会因强类型与弱键入而混淆静态与动态类型。

  • 静态类型:每个变量,方法参数,返回类型等都有一个在编译时已知的类型,无论是声明的还是推断的。
  • 动态类型:在编译时忽略/不存在类型
  • 强类型:运行时的每个对象都有一个特定的类型,您只能对它执行为该类型定义的操作。
  • 弱类型:运行时对象要么没有显式类型,要么系统会尝试在必要时自动转换类型。

这两个对立面可以自由组合:

  • Java是静态且强类型的
  • C是静态和弱类型(指针算术!)
  • Ruby是动态且强类型的
  • JavaScript是动态和弱类型的

一般来说,静态类型意味着编译器捕获了许多错误,这些错误是动态类型语言中的运行时错误 - 但这也意味着您花费大量时间担心类型,在许多情况下不必要地(参见接口)与鸭子打字)。

强类型意味着类型之间的任何转换必须是显式的,可以通过强制转换或通过使用转换方法(例如将字符串解析为整数)。这意味着更多的打字工作,但具有让你控制事物的优势,而弱的打字通常会导致混乱,当系统做一些模糊的隐式转换,留下一个完全错误的变量值,导致破坏十个方法调用线。

答案 1 :(得分:4)

在C ++ / Java中,您无法更改变量的类型。

静态类型:变量在编译类型中分配了一种类型且不会更改。

动态类型:变量的类型可以在运行时更改,例如在JavaScript中:

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

答案 2 :(得分:1)

主要区别在于,在动态类型语言中,除非在该运行时使用方法,否则您不知道该方法是否存在。在静态类型语言中,检查是在编译时进行的,如果方法不存在,编译将失败。

答案 3 :(得分:1)

  

我想知道我的代码是什么意思。

类型系统不一定会对代码看起来有什么影响,例如:静态类型,类型推断和隐式转换(例如Scala)的语言看起来很像动态类型语言。另见:What To Know Before Debating Type Systems

答案 4 :(得分: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 ++中使用联合来实现某种动态类型。

答案 5 :(得分:0)

让我们看一下Java,因为他是动态类型的语言和JavaScript。在Java中,对于对象,变量是对对象的引用。该对象具有运行时类型,并且引用具有类型。引用的类型必须是运行时对象的类型或其祖先之一。这就是多态性的工作原理。您必须强制转换为引用类型的层次结构,但不能向下。编译器确保满足这些条件。在像JavaScript这样的语言中,你的变量就是变量。你可以让它指向你想要的任何物体,在你检查之前你不知道它的类型。

对于转换,有很多方法,比如Java中的toInteger和toFloat进行转换,并生成具有相同相对值的新类型的对象。在JavaScript中也有转换方法,但它们也会生成新对象。

答案 6 :(得分: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