为什么要在instanceOf之后进行强制转换?

2023-11-29

在下面的例子中(来自我的课程包),我们想要给Square实例c1其他对象的引用p1,但前提是这两个类型是兼容的。

if (p1 instanceof Square) {c1 = (Square) p1;}

我在这里不明白的是我们首先检查p1确实是一个Square,然后我们仍然投射它。如果它是一个Square,为什么要投?

我怀疑答案在于表面类型和实际类型之间的区别,但我仍然很困惑......

Edit:
编译器将如何处理:

if (p1 instanceof Square) {c1 = p1;}

Edit2:
问题是instanceof检查actual类型而不是apparent类型?然后演员阵容改变了apparent type?


旧代码将无法正常工作

The 隐含的演员特征毕竟这是合理的,但由于向后兼容性,我们很难将这个 FR 实现到 java。

看看这个:

public class A {
    public static void draw(Square s){...} // with implied cast
    public static void draw(Object o){...} // without implied cast
    public static void main(String[] args) {
        final Object foo = new Square();
        if (foo instanceof Square) {
            draw(foo);
        }
    }
}

当前的 JDK 将编译第二个声明方法的用法。 如果我们用java实现这个FR,它将编译为使用第一种方法!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么要在instanceOf之后进行强制转换? 的相关文章

  • Java 迭代器获取下一个而不递增

    我正在用 Java 编写以下循环 对于每个循环 我想访问链表 r 的当前元素和下一个元素 List
  • 声纳违规:安全性 - 使用 byte[] 时直接存储数组

    我确实遇到过以下两篇关于类似问题的帖子声纳违规 https stackoverflow com questions 11580948 sonar violation security array is stored directly and
  • 如何在 Groovy 中的 JSON Converter 方法中保留字母大小写?

    我正在尝试将 groovy 对象解析为 JSON 属性名称不遵循正确的驼峰式大小写形式 class Client String Name Date Birthdate 当我使用这个时 Client client new Client Nam
  • 黄瓜与 Micronaut

    我正在尝试将 Cucumber 与 Micronaut 一起使用 但当我尝试将其与 Cucumber 一起使用时 MicronautTest 注释根本不起作用 未注入 theApple 请参阅下面的代码 如果我在没有黄瓜的情况下运行它就可以
  • Java 中的本机方法

    我花了一些时间学习什么是 Java Native 方法以及它们是在平台相关代码 主要是 C 中实现的 但是我在哪里可以找到这些 Java 的本机实现呢 例如 Thread 类的 sleep long millis 方法是本机的 但它的实现代
  • 为什么 MetaSpace 大小是已用 MetaSpace 的两倍?

    我写了一个程序来模拟MetaSpace OOM 但我发现MetaSpace Size几乎总是两倍大Used MetaSpace Why 我用标志运行我的程序 XX MaxMetaspaceSize 50m 程序抛出OOM时Used Meta
  • 将二进制数据的 byte[] 转换为 String

    我有二进制格式的数据 hex 80 3b c8 87 0a 89 我需要将其转换为字符串 以便通过 Jackcess 将二进制数据保存在 MS Access 数据库中 我知道 我不打算在 Java 中使用 String 来存储二进制数据 但
  • 在 javafx 中注册鼠标处理程序,但处理程序不是内联的

    我有一个 JavaFX 应用程序变得有点大 我想保持代码的可读性 我有一个折线图 我希望内置缩放功能 该功能在单击鼠标时发生 我知道我需要向图表注册鼠标侦听器 我无法从 Oracle 示例中弄清楚什么 即如下所示 http docs ora
  • 比较和删除列表和数组java中不存在的元素

    我有一个String数组和一List
  • 如何使用 UUID 生成唯一的正 Long

    我需要为我的数据库主键列生成唯一的长 ID 我以为我可以用UUID randomUUID getMostSignificantBits 但有时它也会产生一些负多头 这对我来说是个问题 是否可以从 UUID 中仅生成正长 将会有数十亿个条目
  • 在 Java 中打开现有文件并关闭它。

    是否可以在java中打开一个文件附加数据并关闭多次 例如 psuedocode class variable declaration FileWriter writer1 new FileWriter filename fn1 writer
  • 如何在 Spring Boot 中创建 Apache POI Excel 视图配置

    当我想使用 Spring Boot Web 将数据导出到 Excel 时遇到问题 我使用 Thymeleaf 作为模板引擎 由 Spring Boot 自动配置 但是当我在附加配置中添加 XmlViewResolver 时 由 XmlVie
  • JSP 作为电子邮件模板

    有没有办法发送 MIME 电子邮件 其中电子邮件正文源自 JSP 我需要使用 Javamail 发送一封电子邮件 其中包含一个表格 我认为如果我可以使用 JSP 来完成所有格式设置和布局 将会很方便 在这个线程中 Java 电子邮件模板的建
  • 如何获取队列中的第 n 个项目?

    我的应用程序中有许多队列和优先级队列 我想轻松访问这些队列中的第 n 个项目 但没有看到使用 API 实现此目的的简单方法 我想我可以创建一个Iterator并迭代到第 n 个元素或使用toArray index 但似乎应该有一个更简单的方
  • Android - 保持用户登录状态

    我正在尝试使用 PHP 和 MySQLi for Android 进行登录 我不明白的是如何保持用户登录状态 我看到一个简单的教程 其中有人使用 SQLite 来保护信息 但我不知道这是否真的安全 如何保存用户信息以保持用户登录状态 谢谢
  • HashSet 与 LinkedHashSet

    它们之间有什么区别 我知道 LinkedHashSet 是 HashSet 的有序版本 维护一个跨所有元素的双向链接列表 使用此类代替 HashSet 当您关心迭代顺序时 当你迭代 HashSet 时 顺序是不可预测的 而 LinkedHa
  • 线程睡眠阻止我的 Swing 应用程序执行

    我的应用程序发生的事情是有道理的 但我不知道如何修复它 以下是我的应用程序功能的简要描述 计时器窗口应显示在屏幕右下角并显示实时时间 一小时后 它应该执行一些操作 我还没有决定该操作 我面临的问题是定时器 java当我刷新实时计时器的秒数时
  • 在 Java 服务器中验证 Windows 用户

    我正在开发一个用 Java 编写的服务器和一个在同一网络上的 Windows 计算机上运行的客户端 用 Net 编写的桌面应用程序 我希望进行一些基本身份验证 以便服务器可以确定运行客户端的用户的用户名 而不需要用户在客户端中重新输入其 W
  • 根据 Java 环境变量中的值创建使用 @JsonIgnore 的自定义注释

    我需要创建一个新的注释 用于在环境变量设置时忽略输出 JSON 文件中的字段var false 我尝试使用JsonAnnotationIntrospector 但无法获得预期的输出 public class Vehicle String v
  • javafx中的stackpane和root有什么区别?

    我正在练习javafx做饼图 以下是开发饼图的代码 如果我这样做Group并与StackPane 我发现输出没有区别 我已经评论了组部分 只是徘徊两者之间的区别 import javafx application Application i

随机推荐

  • 对嵌套列表进行排序

    给出的是一个嵌套列表 具有以下标记 遗憾的是目前无法更改 我想对此列表进行排序 以及按 a 标签标题排序的所有嵌套列表 第一个 div 未嵌套在 li 中 应该用于对 ul 同级进行排序 性能也很重要 因为这个列表很容易包含超过 100 个
  • Pygame 从全屏切换到正常不起作用

    我目前正在尝试设置从窗口模式和全屏模式切换的设置 但是进入全屏并尝试返回后 游戏错误非常奇怪并且粘在左上角 顺便提一句 显示宽度 1280 显示高度 720 elif Settings Menu True screen fill 0 0 0
  • jQuery:如何动态检测窗口宽度?

    我的页面上有一个滚动元素 使用 jScrollPane jQuery 插件 我想要完成的是一种通过检测浏览器窗口的宽度来关闭滚动窗口的方法 我正在做响应式布局 我希望当浏览器低于一定宽度时关闭此滚动功能 当我刷新页面时 我能够使其工作 但是
  • 在 while 循环内将对象添加到列表中

    我正在尝试循环一个列表 该列表内部有 4 个数组 每个数组有 7 个值 我正在循环列表 然后当我从列表中获取一个数组时 因为我知道有多少个值具有该数组 所以我分配每个数组索引 如下所示 personObject setName String
  • 如何正确编码完整的 http url 字符串?

    我从用户那里获得一个 url 字符串 并希望将其转换为合法的 http url http one two Three four five 应该变成 http one two Three four 20 Five 但是 URLEncoder
  • Sass @import 指令在 Rails 引擎中使用时无法在插件中找到资源

    我正在构建一个使用 zurb foundation 样式表的 Rails 引擎 并且不断遇到相同的 Sass Syntax 错误 这看起来很奇怪 因为我在 Rails 应用程序中遵循了相同的过程 并且第一次尝试就成功了 因此 我决定通过启动
  • SQL:选择其他查询未选择的所有记录

    我正在寻找一个 SQL 查询来选择同一个表上的另一个查询未选择的所有记录 具体来说 我想选择具有特定字段 fieldA 重复项的所有记录 然后删除除其中一条记录之外的所有记录 因此 select 语句可能类似于以下内容 这不起作用 sele
  • javascript 调用函数 10 次,每次间隔 1 秒

    如何调用一个函数 10 次 for x 0 x lt 10 x callfunction 但每次通话之间间隔 1 秒 function callNTimes func num delay if num return func setTime
  • 如何在 SceneKit 中使用着色器添加透明度?

    我想从图像中获得透明效果 现在我只是用圆环进行测试 但着色器似乎不适用于 alpha 据我从这个帖子中了解到的 在 Scenekit 中使用混合函数 以及这个关于透明度的维基链接 http en wikibooks org wiki GLS
  • 如何将dojo工具包与rails 3.1 asset pipeline和coffeescript一起使用?

    我正在尝试在 Rails 3 1 应用程序上使用 dojo toolkit 作为 JS 框架 但我正在努力将 dojo require 结构与 sprockets require 和 Coffeescript 结合起来 看起来dojo需要磁
  • 如何使用 netbeans 在 java 中每次掷骰子后询问用户是否愿意继续游戏?

    我需要帮助解决这个问题 掷骰子游戏是用两个六面骰子进行的 玩游戏的用户将掷两个骰子 并生成两个介于 1 到 6 之间的随机数 两个数字的总和将用于决定下一步 如果总和为 2 3 或 12 则玩家获胜 如果总和是 7 或 11 那么他 她就输
  • 关闭 SKScene 返回 UIKit 菜单

    一旦我的 SpriteKit 游戏结束 我想回到我的UIKit MenuViewController 根据我到目前为止所学到的 使用协议 委托是最好的 选项 但我无法让它发挥作用 我知道该协议可能会高于类声明GameViewControll
  • 运行 Fiddler 作为 HTTP 到 HTTPS 反向代理

    我的机器上正在运行一项服务 该服务在 HTTPS 上发布 在 HTTP 上启动似乎有点复杂 某个远程计算机通过 HTTP 对我的计算机执行调用 这不受我的控制 我想对我的服务执行一些非性能关键的测试 看起来最简单的方法是使用有点像 HTTP
  • 在 Fortran 的 SYSTEM 子例程中使用变量

    如何在执行的命令中使用变量system子程序调用 例如 如果我想创建多个目录 例如test 1 1 test 1 2 依此类推 直到test 3 3那么我的代码应该是什么 我正在尝试以下代码 但似乎无法弄清楚在 部分要写什么 integer
  • Git 错误:无法提交配置文件

    我正在尝试将新的远程存储库 GitHub 添加到现有项目 但遇到了一个我以前从未见过且不理解的错误 git remote add github email protected me myrepo git error could not co
  • 标头和 Selenium Webdriver 2

    有没有办法在 Selenium WebDriver 测试中添加标头 与 Firefox 修改标头插件一样 我无法使用 HtmlUnitDriver 因为浏览器必须可见 WebDriver 不允许您使用任何基于浏览器的驱动程序更改或设置标头
  • 如何在设计时禁用子控件?

    我有自己的控制权 源自TCustomPanel 它有一个孩子 TEdit 在上面 type TMyControl class TCustomPanel private FEditor TEdit public constructor Cre
  • 从字典创建类实例属性?

    我正在从 CSV 导入并大致以以下格式获取数据 Field1 3000 Field2 6000 RandomField 5000 字段的名称是动态的 嗯 它们是动态的 因为可能不止 Field1 和 Field2 但我知道Field1 an
  • 如何将 EntityFramework、Repository、UnitOfWork 和 Automapper 结合到一个 MVC 应用程序中?

    首先我决定创建一个名为它的接口IDataAccessLayer并开始将所有内容放入其中 类似的方法GetUsers GetUser int id GetOrderByNumber int number DeleteOrder int Id
  • 为什么要在instanceOf之后进行强制转换?

    在下面的例子中 来自我的课程包 我们想要给Square实例c1其他对象的引用p1 但前提是这两个类型是兼容的 if p1 instanceof Square c1 Square p1 我在这里不明白的是我们首先检查p1确实是一个Square
Powered by Hwhale