Dúvida conceitual tipo: (Integer) a = 10;

4 respostas
jpcasati

Pessoal, gostaria de saber qual o nome disso:

RSAPrivateKey chavePrivada = (RSAPrivateKey) parChaves.getPrivate();

Este método de colocar o tipo do atributo entre parenteses e ele dar um parse para o tipo colocado, como que ele faz isso e tal.

Obrigado!

4 Respostas

T
RSAPrivateKey chavePrivada = (RSAPrivateKey) parChaves.getPrivate();

É o tal do “cast”, mas acho que você já sabe disso, pelo tempo em que posta aqui.

Ele não dá um “parse” - parse é uma outra coisa: é interpretar um texto. Ele faz uma reinterpretação do tipo retornado pela variável ou método.
Por exemplo, parChaves.getPrivate() deve retornar um objeto que pertence a uma classe que implementa a interface RSAPrivateKey. Se a tal classe não implementa essa interface, então o cast vai é lançar uma “ClassCastException”.

jpcasati

thingol:
RSAPrivateKey chavePrivada = (RSAPrivateKey) parChaves.getPrivate();

É o tal do “cast”, mas acho que você já sabe disso, pelo tempo em que posta aqui.

Ele não dá um “parse” - parse é uma outra coisa: é interpretar um texto. Ele faz uma reinterpretação do tipo retornado pela variável ou método.
Por exemplo, parChaves.getPrivate() deve retornar um objeto que pertence a uma classe que implementa a interface RSAPrivateKey. Se a tal classe não implementa essa interface, então o cast vai é lançar uma “ClassCastException”.

Sim, realmente eu uso, mas não sabia oque se passava por trás. Também não tenho vergonha de perguntar, hehehe.
Era isso mesmo que queria saber, muito obrigado, foi de grande ajuda!

fabim

Normalmente isso esta associado a “downcast”, e quer dizer basicamente o seguinte:

Imagina 3 classes: Aeronave(classe pai), e Aviao e Helicoptero, que extendem de Aeronave

Suponhamos que o metodo getPrivate() retorna um objeto Aeronave. Mas vc sabe que, em tempo de execucao, aquele objeto é um Aviao;

Vc pode fazer isso tranquilamente:

Aeronave a = objetoAviao //PERMITIDO, sem necessidade de cast

Mas pra fazer o contrario, vc precisa do cast explicito, pois vc esta dizendo “olha JVM, eu sei que aquele objeto Aeronave ali pode ser tanto um aviao quanto um helicoptero, mas eu estou GARANTINDO pra vc que vai ser um aviao, pois quero chamar metodos especificos dele… entao confia em mim”

Aviao a = (Aviao)objetoAeronave //CAST necessario

Perceba que, se o objetoAeronave for, na verdade, um helicoptero, vc ganhará uma bela ClassCastException (Aviao != Helicoptero);

T

Uma coisa que acho desajeitada em Java é essa sintaxe para casts, que foi herdada do C (nem do C++).

Em C e Java o cast é assim:

RSAPrivateKey chavePrivada = (RSAPrivateKey) parChaves.getPrivate();

Em C++ o cast também pode ser desse jeito, mas você pode usar:

RSAPrivateKey chavePrivada = RSAPrivateKey(parChaves.getPrivate()); /*1*/

ou

RSAPrivateKey chavePrivada = dynamic_cast<RSAPrivateKey>(parChaves.getPrivate()); /*2*/

Eu em particular gosto mais da sintaxe 1, embora ela seja um pouco ambígua em C++ porque ela também pode ser usada para construtores (argh - mas o que não é ambíguo em C++? ), porque ela de certa forma indica que você está pegando a expressão e efetuando alguma operação (que nesse caso é o cast) sobre ela.

Criado 24 de outubro de 2008
Ultima resposta 24 de out. de 2008
Respostas 4
Participantes 3