Java2D:将Graphics强制转换为Graphics2D总是安全的吗?

38
假设我们始终使用Sun JVM(例如1.5+),将Graphics引用强制转换为Graphics2D是否总是安全的?
我还没有看到它引起任何问题,据我所知,Graphics类是遗留代码,但Java设计师不想更改Swing和AWT类的接口以保持向后兼容性。
3个回答

26
根据这里的讨论,从GraphicsGraphics2D的强制转换总是安全的。但是我无法快速找到官方的Sun声明。

之所以可以将Graphics转换为Graphics2D,是因为Sun曾表示Java 1.2或更高版本API返回的所有Graphics对象都将是Graphics2D的子类。

另一个提示在这里得出了同样的结论。

Graphics对象总是可以强制转换为Graphics2D,例如:Graphics2D g2d = (Graphics2D)g;


感谢提供的参考资料。尽管这个参考资料没有直接引用Sun的来源,但我认为它足够接近,所以我打算接受它。 - Tim Frey
据我记得,所有Sun文档都展示了Graphics2D的强制转换,因此我认为这是安全的。如果你真的想严格一点,你可以使用try/catch块,但是我的猜测是,如果你有Graphics2D类(JVM/libs足够新),你是安全的。 - MBCook
第一个链接已经失效。 - FDinoff

11
在 Chet Haase 和 Romain Guy 的书 《性感客户端》 中,他们说 Swing 几乎总是使用一个 Graphics2D 对象,除了打印和 Swing 的 DebugGraphics 对象外。因此,只要您的代码不涉及这些情况,将其转换为 Graphics2D 是安全的。
两位作者都曾在 Sun 工作,所以我认为他们知道自己在说什么。

7

2D图形教程中提到:

要在应用程序中使用Java 2D API功能,请将传递给组件渲染方法的Graphics对象转换为Graphics2D对象。例如:

public void paint (Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    ...
}

这是我能找到的最“官方”的来源。直接来自Sun的Java教程,我认为这是官方认可的方法。虽然如果JavaDocs明确说明这一点,我也不会介意...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接