我在尝试实现仿射变换时遇到了这个类转换异常。
调用仿射变换:
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);
}
它驻留在自定义形状类 (应阳) 中。
public class YingYang implements Shape
{
private Area yingYang = new Area();
private AffineTransform at = new AffineTransform();
...
}
每当我进行调用时,当我尝试从绘图面板或类中将其投射回 YingYang 时,我会收到类转换异常(如果我将返回类型更改为 Yingang。
我像这样打电话:
YingYang newShape = (YingYang) shape.moveToAndRotate(newLoc1.x, newLoc1.y, theta);
这是错误:
java.lang.ClassCastException: java.awt.geom.Path2D$Double 不能强制转换为 Animation.YingYang
自从莹阳实施形状以来,任何想法都会认为我根本不应该铸造这个。我错过了一个关键概念吗?
您会收到类强制转换异常,因为您只能沿继承树向上移动。意思是阴阳是一个形状,但形状不一定是阴阳。createTransformedShape 返回一个 Path2D,它是一个 Shape。但那个形状不是阴阳。
你可以将变量阴阳=新Area()保留在你的阴阳类中,或者让你的阴阳扩展面积。
所以阴阳>有一个区域。这将是阴阳->是一个区域
如果你真的需要保持扩展继承打开,你可以实现一个形状并实现所有方法去阴阳变量。
然后创建一个如下所示的构造函数
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));