Casting de tipo primitivo para tipo de usuario

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.

[quote]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[/quote]

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

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:

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)

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

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

[quote=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[/quote]

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

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

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

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

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

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.

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.