gpt4 book ai didi

java - 向下转换 Graphics 实例 - 为什么允许这样做?

转载 作者:搜寻专家 更新时间:2023-11-01 01:27:02 24 4
gpt4 key购买 nike

我想弄清楚为什么允许将 Graphics 实例向下转换为 Graphics2D 实例。

向下转换未继承目标类型的引用类型通常是违反规则的。

在面向图形的类中,层次结构如下:

  1. 图形是父类(super class)
  2. Graphics2D 是父类(super class) Graphics 的子类

当在 Swing 中绘制某些东西时,您会覆盖 paint() 方法 - 如果您需要 2D 绘图,您会将自动提供的 Graphics 实例从 paint() 方法向下转换为 Graphics2D 实例:

public void paint(Graphics g)
{
super.paint(g);

Graphics2D g2d = (Graphics2D)g;
}

但这是反过来的? Graphics 实例不是继承了 graphics2D 实例 - 在查看类层次结构时,Graphics2D 实例继承了 Graphics 实例!

为什么允许这样做?

最佳答案

Graphics2D 是一个继承自 Graphics 的类 - 就像“人类”是“两足动物”的一类一样,确实所有人类都是两足动物但并非所有两足动物都是人类。

java.awt.Graphics 可以追溯到 Java 的早期,并且不是很复杂。 Waphen Swing 和 Java2D 被创建,Graphics2D 被创建为 Graphics 的子类,以便旧代码可以工作 - 向后兼容性是 Sun 的一种信仰(而且不是坏的) .

JComponent 和其他 Swing 类继承自使用旧 API 的 java.awt.Component。为了让人们可以轻松地从 AWT 迁移到 Swing,而无需对父类(super class)进行任何更改,Swing 保留了采用 Graphics 而不是 Graphics2D 的签名。

据详细记载,在 Swing 中,传递给 paint(Graphics) 的图形将始终是 Graphics2D,因此您不需要备用代码路径来处理不是的情况。

关于java - 向下转换 Graphics 实例 - 为什么允许这样做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17601956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com