Duvidas com Reflexao junto com cast... + bugs do Shape

5 respostas
icarocd

olá,

Gostaria de saber como converter um Object para o seu tipo mais específico, sem que se conheça este seu tipo.

Isso é para resolver, de uma forma, infelizmente, nao muito elegante, o seguinte problema:

//NAO FUNCIONA:

RectangularShape rec = shape.getBounds2D();

rec.setFrame(

x,

rec.getY(),

rec.getWidth(),

rec.getHeight()

);
//FUNCIONA:

RectangularShape rec = (RectangularShape)shape;

rec.setFrame(

x,

rec.getY(),

rec.getWidth(),

rec.getHeight()

);

Ou seja, pelo método getBounds2D, de Shape, eu não estou conseguindo alterar a posição do shape (neste caso acima, a abscissa x), de forma que eu sou obrigado a converter o shape pra seu tipo especifico para fazer isso. O problema é que meu subtipo de Shape não é somente RectangularShape, mas também um Line2D, entre outros… (há varios tipos na minha aplicacao…) Daí a necessidade de identificar de forma automatica o tipo pra fazer a conversao… Deu pra entender?!?

5 Respostas

cu_ringa

use herança como nesse exemplo:

abstract class Shape{
	
	public abstract void imprimir();	
}

class Retangulo extends Shape {
	
	public void imprimir(){
		
		System.out.println("retangulo");
	}
	
}

class Quadrado extends Shape {
	
	public void imprimir(){
		
		System.out.println("quadrado");
	}
}

public class Principal {
	
	public Principal(){
		Retangulo r = new Retangulo();
		Quadrado q = new Quadrado();
		Shape s = r;
		s.imprimir();
		s = q;
		q.imprimir();
	}
	
	public static void main(String args[]){
		
		new Principal();
	}	
}

se quiser pode transformar Shape numa interface em vez de uma classe.

benflodin

pode usar tambem o operador “instanceof”

edit:
da uma olhada nesse link
http://www.javafree.org/javabb/viewtopic.jbb?t=1365

icarocd

obrigado cu_ringa e benflodin, mas eu já tinha conhecimento do que disseram. na verdade eu estava tentando corrigir algo de errado da propria implementacao da Sun para a classe Shape. Ja resolvi o problema aqui com uns ganchos infelizes, testando individualmente o tipo e convertendo… mas valeu assim mesmo pela ajuda.

louds

Você pode usar o padrão strategy e usar como chave o tipo do objeto.

T

normalmente isso ocorre quando vc esta tentando usar as coisas especificas para a implementacao e nao da interface (claro que as vezes pode mesmo ser um bug da implementacao)…

Criado 15 de julho de 2006
Ultima resposta 17 de jul. de 2006
Respostas 5
Participantes 5