Conversões e promoções em Java

Feb 22 2023
Neste artigo, discutiremos a conversão primitiva. · Conversão de tipo ∘ Conversão implícita de tipo ∘ Conversão explícita de tipo· Promoção automática de tipo em expressões· Diferença entre conversão de tipo e coerção de tipo tipo de dados para outro.

Neste artigo, discutiremos a conversão primitiva .

· Conversão de tipo
∘
Conversão de tipo implícito
∘
Conversão de tipo explícito
·
Promoção automática de tipo em expressões
·
Diferença entre conversão de tipo e coerção de tipo

Na ciência da computação, conversão de tipo , conversão de tipo , coerção de tipo e malabarismo de tipo são maneiras diferentes de alterar uma expressão de um tipo de dados para outro. Um exemplo seria a conversão de um valor inteiro em um valor de ponto flutuante ou sua representação textual como uma string e vice-versa. As conversões de tipo podem aproveitar certos recursos de hierarquias de tipo ou representações de dados. Dois aspectos importantes de uma conversão de tipo são se ela ocorre implícita (automaticamente) ou explicitamente e se a representação de dados subjacente é convertida de uma representação em outra ou se uma determinada representação é meramente reinterpretadacomo a representação de outro tipo de dados. Em geral, os tipos de dados primitivos e compostos podem ser convertidos.

Cada linguagem de programação tem suas próprias regras sobre como os tipos podem ser convertidos. Linguagens com tipagem forte normalmente fazem pouca conversão implícita e desencorajam a reinterpretação de representações, enquanto linguagens com tipagem fraca realizam muitas conversões implícitas entre tipos de dados. A linguagem de digitação fraca geralmente permite forçar o compilador a interpretar arbitrariamente um item de dados como tendo representações diferentes - isso pode ser um erro de programação não óbvio ou um método técnico para lidar diretamente com o hardware subjacente.

Java fornece vários tipos de dados, provavelmente qualquer outra linguagem dinâmica, como boolean, char, int, unsigned int, assinado int, float, double, long, etc.

conversão de tipo

Se você tem experiência anterior em programação, já sabe que é bastante comum atribuir um valor de um tipo a uma variável de outro tipo. Se os dois tipos forem compatíveis, o Java realizará a conversão automaticamente (conversão de tipo ) . Por exemplo, sempre é possível atribuir um valor int a uma variável longa. No entanto, nem todos os tipos são compatíveis e, portanto, nem todas as conversões de tipo são permitidas implicitamente . Por exemplo, não há conversão automática definida de double para byte. Felizmente, ainda é possível obter uma conversão entre tipos incompatíveis. Para fazer isso, você deve usar um cast , que executa um explícitoconversão entre tipos incompatíveis. Vejamos as conversões de tipo automáticas ou ampliadas ( coerção de tipo , malabarismo de tipo ) e a conversão explícita ou estreita ( conversão de tipo ).

Como você pode ver, é possível realizar uma conversão em um valor numérico, bem como em uma variável. Observe que você pode introduzir moldes supérfluos; por exemplo, o compilador promoverá automaticamente um valor int para long quando necessário. No entanto, você pode usar conversões supérfluas para enfatizar ou esclarecer seu código. Em outras situações, uma conversão pode ser essencial apenas para compilar o código.

Em C e C++, a conversão de tipo pode causar algumas dores de cabeça. Em Java, a conversão é segura, com a exceção de que, quando você executa a chamada conversão de restrição (ou seja, quando passa de um tipo de dados que pode conter mais informações para outro que não contém tanto), você executa o risco de perda de informações. Aqui, o compilador força você a usar um cast (conversão de tipo) , na verdade dizendo: “Isso pode ser uma coisa perigosa de se fazer - se você quiser que eu faça de qualquer maneira, você deve tornar a conversão explícita.” Com uma conversão de alargamento, uma conversão (conversão explícita) não é necessária, porque o novo tipo mais do que reterá as informações do tipo antigo, de modo que nenhuma informação seja perdida. Java permite que você converta qualquer tipo primitivo em qualquer outro tipo primitivo, exceto boolean, que não permite nenhuma conversão. Os tipos de classe não permitem a conversão. Para converter um para o outro, deve haver métodos especiais. (…)

Conversão implícita de tipo

Também conhecido como 'conversão de tipo automática ou wedninig'.

  • Feito pelo próprio compilador, sem nenhum gatilho externo do usuário.
  • Geralmente ocorre quando em uma expressão mais de um tipo de dados está presente. Nessa condição, a conversão de tipo (promoção de tipo) ocorre para evitar a perda de dados.
  • Todos os tipos de dados das variáveis ​​são atualizados para o tipo de dados da variável com o maior tipo de dados.
  • bool -> char -> short int -> int -> 
    
    unsigned int -> long -> unsigned -> 
    
    long long -> float -> double -> long double
    

  • Os dois tipos são compatíveis. Por exemplo, tipos de dados como numeric são compatíveis com outros tipos de dados numéricos, mas não são compatíveis com tipos de dados boolean , char ou String . Da mesma forma que String não é compatível com um tipo de dados booleano .
  • O tipo de destino é maior que o tipo de origem.

É possível que conversões implícitas percam informações, sinais podem ser perdidos (quando assinado é implicitamente convertido em não assinado) e pode ocorrer estouro (quando long long é implicitamente convertido em flutuante).

às vezes nos referimos a esse tipo de conversão como tipo ceorcion.

Em Java, o mecanismo de conversão de um tipo de objeto em outro objeto de tipo diferente com conteúdo semelhante é conhecido como coerção. Em outras palavras, podemos dizer que a coerção é o processo de conversão de um tipo de dados em outro tipo de dados. De forma mais específica, a conversão implícita é chamada de coerção . Também é conhecido como coerção de tipo .

No tipo ceorcion , um tipo de dados é convertido automaticamente em outro tipo de dados por um compilador no momento do compilador. No tipo ceorcion , o tipo de dados de destino não pode ser menor que o tipo de dados de origem, por isso também é chamado de conversão de alargamento. Mais uma coisa importante é que ele só pode ser aplicado a tipos de dados compatíveis.

Tipo Ceorcion exemplo –

int x=30;
float y;
y=x;  // y==30.000000.

Java forçará automaticamente os dados na direção das setas, sólidas ou tracejadas. Por exemplo:

Coerções que atravessam uma seta pontilhada são permitidas, mas podem resultar em perda de precisão. Isso significa que o valor convertido pode não ser igual ao valor inicial. Por exemplo:

Ocorrerá um erro do compilador se qualquer instrução tentar coagir os dados contra a direção das setas.

Vejamos um exemplo de conversão implícita de tipo em Java.

Aqui, converteremos um valor int em um valor long e, finalmente, em um valor double usando um operador de atribuição simples:

public class Main {
  public static void main(String[] args) {
    int a = 20;
    long b = a;     //implicit casting from int to long data type
    double c = b; 
    System.out.println(a);
    System.out.println(b);
    System.out.println(c);
  }
}  // implicit casting from long to double data type

20
20
20.0

Em outras palavras, “conversão de tipo” refere-se ao processo geral de alteração de um tipo, enquanto a coerção de tipo refere-se mais especificamente à conversão implícita de um tipo. Podemos ainda subdividir a coerção de tipo em dois tipos — controlada pelo programador e controlada pelo compilador (às vezes chamada de malabarismo ).

Conversão de tipo explícito

Embora as conversões automáticas de tipo sejam úteis, elas não atenderão a todas as necessidades. Por exemplo, e se você quiser atribuir um valor int a uma variável de byte? Essa conversão não será realizada automaticamente, pois um byte é menor que um int. Esse tipo de conversão às vezes é chamado de conversão de tipo e é definido pelo usuário.

Esse processo também é chamado de conversão de tipo de restrição, pois você está explicitamente tornando o valor mais restrito para que ele caiba no tipo de destino.

Para criar uma conversão entre dois tipos incompatíveis, você deve usar uma conversão de tipo. Uma conversão é simplesmente uma conversão de tipo explícita.

Em Java, isso pode ser feito usando um operador cast () :

Isso é feito definindo explicitamente o tipo necessário na frente da expressão entre parênteses.

Tem esta forma geral:

(target-type) expression

Aqui, target-type especifica o tipo desejado para o qual converter o valor especificado. Por exemplo, o fragmento a seguir converte um int em um byte . Se o valor do inteiro for maior que o intervalo de um byte , ele será reduzido módulo (o restante de uma divisão inteira pelo) intervalo do byte.

int a; 
byte b; // … 
b = (byte) a;

O programa a seguir demonstra algumas conversões de tipo que requerem conversões:

// Demonstrate casts.
class Conversion {
public static void main(String args[]) {
byte b;
int i = 257;
double d = 323.142;
System.out.println("\nConversion of int to byte.");
b = (byte) i;
System.out.println("i and b " + i + " " + b);
System.out.println("\nConversion of double to int.");
i = (int) d;
System.out.println("d and i " + d + " " + i);
System.out.println("\nConversion of double to byte.");
b = (byte) d;
System.out.println("d and b " + d + " " + b);
}
}

Conversion of int to byte. i and b 257 1 
Conversion of double to int. d and i 323.142 323 
Conversion of double to byte. d and b 323.142 67

Vejamos um exemplo de conversão explícita em Java:

public class Main  {  
  public static void main(String args[])  {  
    double d = 57.17;  
    int i = (int)d;  // Explicit casting from long to int data type
    System.out.println(d);  
    System.out.println(i);  //fractional part lost
  }  
}

57.17
57
57

Promoção Automática de Tipo em Expressões

A promoção de tipo é uma ocorrência comum na programação Java, que pode ser obtida automaticamente com tipos de dados primitivos por meio do uso da promoção de autotipo. Também é conhecido como promoção automática de tipo de dados.

Como você deve saber, além das atribuições, há outro lugar onde certas conversões de tipo podem ocorrer: em expressões.

Abaixo está uma ilustração esquemática de possíveis promoções de tipo:

Você descobrirá que, se executar qualquer operação matemática ou bit a bit em tipos de dados primitivos menores que um int (ou seja, char, byte ou short), esses valores serão promovidos para int antes de executar as operações e o resultado o valor será do tipo int. Portanto, se você deseja atribuir de volta ao tipo menor, deve usar uma conversão. (E, como você está atribuindo de volta a um tipo menor, pode estar perdendo informações.) Em geral, o maior tipo de dados em uma expressão é aquele que determina o tamanho do resultado dessa expressão; se você multiplicar um float e um double, o resultado será double; se você adicionar um int e um long, o resultado será long.

Para entender mais:

considere o seguinte. Em uma expressão, a precisão exigida de um valor intermediário às vezes excederá o intervalo de qualquer um dos operandos. Por exemplo, examine a seguinte expressão:

byte a = 40;
byte b = 50;
byte c = 100;
int d = a * b / c;

Por mais úteis que sejam as promoções automáticas, elas podem causar erros confusos em tempo de compilação. Por exemplo, este código aparentemente correto causa um problema:

byte b = 50;
b = b * 2; // Error! Cannot assign an int to a byte!

Nos casos em que você entende as consequências do estouro, deve usar uma conversão explícita, como

byte b = 50;
b = (byte)(b * 2);

Regras para promoção de tipo automática

As seguintes regras para promoção de tipo devem ser seguidas ao executar expressões em Java para obter resultados corretos:

  • Todas as variáveis ​​dos tipos byte , short e char devem ser promovidas automaticamente para int .
  • Se alguma variável que participa de uma operação for longa , o resultado da operação deverá ser longo .
  • Se alguma variável que faz parte de uma operação for float , o resultado da operação deve ser float .

Vamos ver alguns exemplos de Java descrevendo as regras de promoção numérica em Java-

1- Quando um dos operandos é duplo.

public class PromotionExample {
 public static void main(String[] args) {
  int i = 30;
  double d = 2.5;
  double result = i * d;
  System.out.println("Result is- " + result);
 }
}
// output :
// Result is- 75.0

2- Quando um dos operandos for float.

public class PromotionExample {
 public static void main(String[] args) {
  short s = 4;
  int i = 30;
  float f = 6.75f;
  float result = (s+i) * f;
  System.out.println("Result is- " + result);
 }
}
//output
// Result is- 229.5

3- Tentar atribuir o resultado a int quando um dos operandos for float.

public class PromotionExample {
 public static void main(String[] args) {
  byte a= 100;
  byte b= 50;
  int i= 80;
  float f = 80;
  result = f/i *b; // line 6
 }
}

      
                
error line 6

Vamos ver a diferença entre conversão de tipo e coerção de tipo, que são fornecidas abaixo:

  1. Na conversão de tipo, um tipo de dados é convertido em outro tipo de dados por um programador usando o operador de conversão. Considerando que na coerção de tipo, um tipo de dados é convertido em outro tipo de dados por um compilador.
  2. A conversão de tipo pode ser aplicada a tipos de dados compatíveis , bem como a tipos de dados incompatíveis . Considerando que a coerção de tipo só pode ser aplicada a tipos de dados compatíveis .
  3. Na conversão de tipo, o operador de conversão é necessário para converter um tipo de dados em outro tipo de dados. Enquanto na coerção de tipo, não há necessidade de um operador de conversão.
  4. Na conversão de tipo ( conversão de tipo explícito ), o tipo de dados de destino pode ser menor que o tipo de dados de origem, ao converter o tipo de dados para outro tipo de dados. Considerando que na coerção de tipo ( conversão de tipo implícita ), o tipo de dados de destino não pode ser menor que o tipo de dados de origem.
  5. A conversão de tipo ocorre durante o projeto do programa pelo programador. Considerando que a conversão de tipo ( conversão implícita de tipo) é feita no tempo de compilação.
  6. A conversão de tipo também é chamada de conversão de restrição porque, nela, o tipo de dados de destino pode ser menor que o tipo de dados de origem. Considerando que a coerção de tipo ( conversão implícita de tipo) também é chamada de conversão de ampliação porque, nesse caso, o tipo de dados de destino não pode ser menor que o tipo de dados de origem.
  7. A conversão de tipo é frequentemente usada em trabalhos de codificação e programação competitiva. Considerando que a coerção de tipo ( conversão implícita de tipo) é menos usada na codificação e programação competitiva, pois pode causar respostas incorretas.
  8. A conversão de tipos é mais eficiente e confiável. Considerando que a coerção de tipos ( conversão implícita de tipos) é menos eficiente e menos confiável.

Apoie nossa publicação seguindo-a

Consulte também os seguintes artigos.

2023 React JS Trends to Watch The Click jacking e suas medidas preventivas Splunk Integration with SpringBoot Parte — 1 Codificação: Verifique se duas strings são anagramas em Javascript Por que Java é a linguagem de programação mais amada do planeta Entenda os métodos em Java 5 Perguntas comuns sobre JavaScript: Introdução à arquitetura Spark 25. Maior subárvore de pesquisa binária (BST)