2013-10-27 3 views
2

AffineTransform 구현시이 클래스 캐스트 예외가 발생했습니다. 의 AffineTransform에Java 클래스 Cast Exception java.awt.geom.Path2D.Double

전화 :

public Shape moveToAndRotate(double x, double y, double theta) 
{ 
    double cx = getBounds2D().getCenterX(); 
    double cy = getBounds2D().getCenterY(); 

    at.translate(cx, cy); 
    at.translate(x, y); 
    at.rotate(Math.toRadians(theta)); 
    at.translate(-cx, -cy); 
    return at.createTransformedShape(yingYang); 
} 

이것은 사용자 정의 모양 클래스 (YingYang)에 있습니다.

public class YingYang implements Shape 
{ 
    private Area yingYang = new Area(); 
    private AffineTransform at = new AffineTransform(); 
    ... 
} 

때 제가 YingYang에 반환 형식을 변경하는 경우 (도면 패널에서 또는 클래스 그 자체 내 중 하나 YingYang이 다시 캐스팅 할 때 나는 클래스 캐스트 예외가 전화를 걸 이제까지.

나는 호출과 같이합니다

가 java.lang.ClassCastException가 : java.awt.geom.Path2D $ 두 번이 애니 캐스트 할 수없는

YingYang newShape = (YingYang) shape.moveToAndRotate(newLoc1.x, newLoc1.y, theta); 

이 오류입니다 ming.YingYang

잉잉 (YingYang)이 모양을 구현하기 때문에 어떤 아이디어라도 나는 이것을 전혀 던지면 안된다고 생각할 것입니다. 핵심 개념이 빠졌습니까?

+0

같은 생성자 당신은 at''의 정의와 변수'shape'처럼 중요 비트를 왼쪽으로합니다. 우리는 당신이하고있는 것을보기에 충분한 코드를 보여줄 필요가 있습니다. –

+0

YingYang은 Shape ...을 구현하지만 ...'createTransformedShape'는 Path2D를 반환합니다. 즉, YingYang 인스턴스가 길지는 않지만 YingYang과 관련이없는 전혀 새로운 모양의 오브젝트입니다. 그런 이유로 왜곡 할 수 없습니다. – Ash

+0

오류가 무엇인지 확인하십시오. 분명히 [Path2D.Double]을 캐스팅하려고합니다 (http://docs.oracle.com/javase/7/docs/api/java/awt/geom/Path2D.Double.html).)를 YingYang으로, Path2D를 YingYang으로 옮기지 않았습니다. – lealand

답변

2

상속 트리 만 올라갈 수 있기 때문에 클래스 캐스팅 예외가 발생합니다. 의미는 YinYang은 Shape이지만 Shape은 반드시 YinYang이 아닙니다. createTransformedShape가 Shape 인 Path2D를 리턴합니다. 그러나 그 모양은 음양이 아닙니다.

변수 yinYang = new Area(); 귀하의 YinYang 수업 내에서 또는 귀하의 YinYang 영역을 확장하십시오.

그래서 YinYang ->에는 a 영역이 있습니다. 그것은 YinYang이 될 것입니다 -> 영역입니다

확장 상속을 열어 두어야한다면 셰이프를 구현하고 모든 메서드를 구현하여 yinYang 변수로 이동할 수 있습니다.

그런 다음 다음

private class YinYang extends Area { 
    public YinYang(Shape shape) { 
     super(shape); 
    } 
} 

public Shape moveToAndRotate(double x, double y, double theta) 
{ 
    double cx = getBounds2D().getCenterX(); 
    double cy = getBounds2D().getCenterY(); 

    at.translate(cx, cy); 
    at.translate(x, y); 
    at.rotate(Math.toRadians(theta)); 
    at.translate(-cx, -cy); 
    return at.createTransformedShape(yingYang); 
} 

YingYang shape = new YingYang(shape.moveToAndRotate(newLoc1.x, newLoc1.y, theta)); 
+0

저는 이제 다른 문제가 생겨서 새로운 문제로 옮길 것입니다. 캐스트 문제가 해결 된 것 같습니다. 이제 0 경계를 반환하는 셰이프에 문제가 발생합니다. [(http://stackoverflow.com/questions/19615100/java-call-to-create-new-area-doesnt-create-shape)] 질문은 여기에 있습니다. – jbolt