Casting de tipo primitivo para tipo de usuario

12 respostas
K

oi! descobri esse forum hoje pq alguem do forum unidev me indicou. muito bom aki :slight_smile:

bom, vo copiar meu post la do unidev e colar aki.

bom, obrigado a kem ler/responder!

keria saber se tem algum jeito de fazer o casting d um tipo primitivo (no meu caso específico, um int) em um tipo definido por mim (q nesse caso eh um tipo pra representar fraçoes, com 2 inteiros, numerador e denominador)… em C# tem como vc fazer isso:

int valorInt; MeuTipo valorMeuTipo = (MeuTipo) valorInt;

bastando sobrecarregar um operador explicit (ou implicit pra converte automaticamente como eu keria). no caso do Java q nao tem sobrecarga d operadores eu nao sei faze. Eu extendi Number, mas nao adianto… em Number soh tem pra converte do MeuTipo pros tipos primitivos e nao ao contrario

eu criei os metodos pra somar, subtrair multiplicar e dividir as fraçoes mas keria que, se eu passasse um int como argumento e nao um objeto do meu tipo, ele convertesse automaticamente (ou q eu pudesse converter explicitamente mesmo, do jeito q eu escrevi no exemplo). Se alguem puder ajudar com qualquer ideia eu agradeço!

obs.: o casting seria apenas transformar o int em numerador e colocar 1 como denominador

12 Respostas

T

Em Java não há sobrecarga de operadores nem "casting" implícito ou explícito; apenas as conversões permitidas pela linguagem.

Entretanto, se quiser fazer a mesma coisa em Scala, que é uma linguagem que roda sob a JVM, você pode.

Vou dar um exemplo:

http://www.scala-lang.org/node/224

object complexOps extends Application {
  class Complex(val re: Double, val im: Double) {
    def + (that: Complex) =
      new Complex(re + that.re, im + that.im)
    def - (that: Complex) =
      new Complex(re - that.re, im - that.im)
    def * (that: Complex) =
      new Complex(re * that.re - im * that.im,
                  re * that.im + im * that.re)
    def / (that: Complex) = {
      val denom = that.re * that.re + that.im * that.im
      new Complex((re * that.re + im * that.im) / denom,
                  (im * that.re - re * that.im) / denom)
    }
    override def toString =
      re + (if (im < 0) "-" + (-im) else "+" + im) + "*i"
  }
  val x = new Complex(2, 1); val y = new Complex(1, 3)
  println(x + y)
}

No código acima foi definida uma aplicação Scala que imprime o resultado da soma dos números complexos 2+i e 1+3i (o programa imprime "3 + 4*i").

K

brigado pela resposta!

nem sabia q tinha outras linguagems pra JVM! :shock:
mesmo assim ainda nem sei java direito axo melhor nao tentar aprender outra linguagem ainda… ainda mais q o resto do codigo da aplicaçai ja ta todo feito em java… essa classe d numeros racionais era soh um detalhe :stuck_out_tongue: eu soh keria um jeito melhor de faze a interface publica da classe… a gente fica mau acustumado depois q conhece a elegancia cristalina do C# hehe

brigado d novo thingol! se nao tem jeito entao tudo bem!

PS.: vou postar o link da sua resposta no forum da unidev pq o amigo q me indicou esse forum aki pidiu q eu fizesse isso case respondessem. Se vc nao kiser q eu faça isso avisa e eu deleto o link. vlw :smiley:

renzonuccitelli

Bom, me atendo ao Java, vc nao faz casting de tipos primitivos pq eles não são objetos. Para isso, vc poderia usar os Wrappers dos primitivos, que no caso de int, seria a classe Integer.
Uma coisa que vc poderia fazer é definir um construtor em sua classe que fizesse uso do int,
SeuTipo seuTipo=new SeuTipo(0)

T

“Elegância cristalina” do C#?
Você está brincando.
De qualquer maneira, mesmo em C# não é muito adequado você ficar fazendo overloading de operadores, a menos que você saiba o que está fazendo.
No seu caso em particular (criar uma classe de números racionais) eu diria que seria a melhor solução mesmo.
Mas em outros casos é melhor ser “burrinho” mesmo e proceder como no Java, onde você não tem surpresas ao ler o código ("+" é sempre uma soma, ou concatenação no caso de strings, e ponto final.)

K

obrigado d novo pelo interesse!

@renzonuccitelli: eu tenho esse contrutor eh assim q eu to fazendo mesmo! valew :slight_smile:

@renzonuccitelli: com a classe Integer teria como eu faze um casting pra MeuTipo?? :?

@thingol: o overloading de operadores explicit eh bem adequado ja q por ser explicito, vc se compromete a saber oq ta fazendo :wink: nao eh nada alem d ensinar como converter de um determinado tipo pra outro

talvez seja kestao de opiniao… sei pouco sobre performance compatibilidade bugs vulnerabilidades e etc… quanto a isso num tenho como defende nem ataca nenhuma linguagem. mas quanto a clareza do codigo e elegancia da linguagem C# eh sim bem superior ao Java

renzonuccitelli

kvikasilfur:
obrigado d novo pelo interesse!

@renzonuccitelli: eu tenho esse contrutor eh assim q eu to fazendo mesmo! valew :slight_smile:

@renzonuccitelli: com a classe Integer teria como eu faze um casting pra MeuTipo?? :?

@thingol: o overloading de operadores explicit eh bem adequado ja q por ser explicito, vc se compromete a saber oq ta fazendo :wink: nao eh nada alem d ensinar como converter de um determinado tipo pra outro

talvez seja kestao de opiniao… sei pouco sobre performance compatibilidade bugs vulnerabilidades e etc… quanto a isso num tenho como defende nem ataca nenhuma linguagem. mas quanto a clareza do codigo e elegancia da linguagem C# eh sim bem superior ao Java

Bom, pra fazer o casting, isso teria que significar que seu tipo herda de Integer.
Nesse caso, vc poderia fazer

SeuTipo seuTipo= (SeuTipo) parametro

Mas uma coisa: vc teria que saber que o parametro é da instancia da classe ou subclasse de SeuTipo. Já vi isso ser necessário qdo estava usando o Pattern Command

K

nao posso herdar d Integer (nem nenhuma dessas classes wrapper d tipos primitivos) pq sao todas classes final

pmlm

A class Integer é final, não pode ser extendida.

renzonuccitelli

Hehe, foi mal então, isso que dá não ler a documentação.

A

exemplo: double numero (double) = 1.1 ???

WellingtonRamos

Isso é o que eu chamo de “mexer em vespeiro que está quieto” :slight_smile:

Na minha opinião, é tudo a mesma coisa… Clareza e elegância de código, quem define é o desenvolvedor. Mas que a sobrecarga de operadores seria muito bem vinda no Java, seria. Quando programava em C++ e “migrei” para Java, foi algo da qual senti falta (tudo bem que eu abusava disso :slight_smile: ).

Existem as classes BigInteger e BigDecimal que você poderia herdar na sua classe mas não há autoboxing neste caso.

WellingtonRamos

Mas o que seria esse questionamento? Vc quer saber se isso está certo? Ou é um exemplo misturado com questionamento de, “seria isso o q vc quer?” ?

de qualquer modo, está errado.

//Ou double numero = 1.1; //Ou double numero = (double) 1.1f; //Mas tbm não seria necessário o cast explícito //Ou float b = (float) 1.1; //Neste caso sim, precisa ser explícito.

Criado 6 de maio de 2009
Ultima resposta 29 de abr. de 2010
Respostas 12
Participantes 6