Faz tipagem estática significa que você tem para lançar uma variável se você quiser mudar o seu tipo?

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

Pergunta

Existem outras maneiras de mudar o tipo de uma variável em uma linguagem de tipagem estática como Java e C ++, exceto 'casting'?

Eu estou tentando descobrir o que a principal diferença é em termos práticos entre dinâmicos e tipagem estática e mantenha encontrar definições muito acadêmicas. Eu estou querendo saber o que isso significa em termos do que meu código parece.

Foi útil?

Solução

Certifique-se de não ficar estático digitação vs. dinâmica confundido com forte vs. tipagem fraca.

  • estática digitando:. Cada variável, parâmetro do método, tipo de retorno etc. tem um tipo conhecido em tempo de compilação, seja declarado ou inferido
  • dinâmica de digitação: tipos são ignorados / não existem em tempo de compilação
  • tipagem forte:. Cada objeto em tempo de execução tem um tipo específico, e você só pode executar essas operações por isso que são definidas para esse tipo
  • fraca digitando:. Runtime objetos não quer ter um tipo explícito, ou as tentativas do sistema para converter automaticamente tipos sempre que necessário

Estes dois opostos podem ser livremente combinadas:

  • Java é estaticamente e fortemente digitado
  • C é estaticamente e fracamente digitadas (aritmética de ponteiro!)
  • Ruby é dinamicamente e fortemente digitado
  • JavaScript é dinamicamente e fracamente digitado

genrally, meios tipagem estática que um monte de erros são capturados pelo compilador que são erros de execução em uma linguagem de tipagem dinâmica - mas também significa que você gasta muito tempo se preocupar com os tipos, em muitos casos, desnecessariamente (consulte Interfaces vs tipagem pato).

meios de digitação forte que qualquer conversão entre tipos deve ser explícita, através de um fundido ou através da utilização de métodos de conversão (por exemplo, a análise de uma cadeia de caracteres em um número inteiro). Isso significa mais digitando trabalho, mas tem a vantagem de mantê-lo no controle das coisas, enquanto digitação fraco muitas vezes resulta em confusão quando o sistema faz alguns conversão implícita obscura que deixa você com um valor variável completamente errado que provoca método estragos dez chamadas para baixo da line.

Outras dicas

Em C ++ / Java você não pode alterar o tipo de uma variável.

estático digitando :. Uma variável tem um tipo atribuído pelo tipo de compilação e que não muda

dinâmica de digitação : tipo de uma variável pode mudar enquanto tempo de execução, por exemplo, em JavaScript:

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

A principal diferença é que em linguagens digitadas dinamicamente você não sabe até que você vá usar um método em tempo de execução se existe esse método. Em linguagens de tipagem estática a verificação é feita em tempo de compilação ea compilação falhará se o método não existe.

Eu estou querendo saber o que isso significa em termos do que meu código parece.

O sistema de tipo não tem necessariamente qualquer impacto no que parece um código como, por exemplo, linguagens com tipagem estática, inferência de tipos e conversão implícita (como Scala por exemplo) parecem muito com linguagens digitadas dinamicamente. Veja também: O que saber antes Debatendo Tipo Sistemas

.

Você não necessidade conversão explícita. Em muitos casos conversão implícita obras.

Por exemplo:

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.)

Você não pode, no entanto, alterar o tipo de uma variável. Você pode usar as uniões em C ++, no entanto, para conseguir algum tipo de tipagem dinâmica.

Vamos olhar para Java para ele linguagem staitically digitado e JavaScript para o dynamc. Em Java, para objectos, a variável é uma referência a um objecto. O objecto tem um tipo de tempo de execução e a referência tem um tipo. O tipo da referência deve ser o tipo do objecto de tempo de execução ou um dos seus antepassados. Isto é como polimorfismo funciona. Você tem que lançar para ir até a hierarquia do tipo de referência, mas não para baixo. O compilador garante que essas condições forem atendidas. Em uma linguagem como JavaScript, sua variável é apenas isso, uma variável. Você pode tê-lo apontar para qualquer objeto que você quer, e você não sabe o tipo dele até que você verifique.

Para conversões, porém, há muitos métodos como toInteger e toFloat em Java para fazer uma conversão e gerar um objeto de um novo tipo com o mesmo valor relativo. Em JavaScript também existem métodos de conversão, mas que geram novos objetos também.

O código deve actally não parece muito diferente, independentemente se você estiver usando uma linguagem staticly digitado ou não. Só porque você pode alterar o tipo de dados de uma variável em uma linguagem de tipagem dinâmica, não significa que é uma boa idéia para fazê-lo.

No VBScript, por exemplo, a notação húngara é muitas vezes usado para especificar o tipo de uma variável de dados preferida. Dessa forma, você pode facilmente detectar se o código é misturar tipos. (Este não foi o uso original de notação húngara, mas é muito útil.)

Ao manter o mesmo tipo de dados, a evitar situações onde é difícil dizer o que o código realmente faz, e situações em que o código simplesmente não funciona corretamente. Por exemplo:

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

Usando notação húngara você pode manchar o código que é a mistura de tipos, como:

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

strId = 42 ' putting a number in a string variable
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top