当前位置: 首页 > 知识库问答 >
问题:

“双铸造”

魏彦
2023-03-14

我目前在辅导一个高中生AP Java,她问了我一个关于“双选”的问题。我以前从未听说过这个术语,但显然她的老师希望她在即将到来的期末考试中知道这个术语。

她的老师提供的例子是,如果你想将一个整数转换成一个字符串,你必须执行以下操作才能避免编译器错误:

Integer i = new Integer(5);
String s = (String)(Object) i;

问题是:你想在现实生活中什么时候这样做?

老师只提供了导致运行时错误的示例。此外,我从来不知道有一个术语,但这样做似乎是个坏主意,因为只有当两种类型不兼容时才会出现错误。

谢谢!

共有3个答案

韩良策
2023-03-14
匿名用户

确实,在大多数情况下,双类型转换会导致< code>ClassCastException,但也有一些特殊情况。正如在其他回答中提到的,它可以用于处理原语和泛型,但也可以在编译的类不一定表示运行时类时使用。当涉及到ASM字节码类转换器时,尤其如此。

作为一个例子,我将使用Misin框架。以下代码将在运行时注入Foo类。我不会过多介绍这是如何工作的细节。

@Mixin(Foo.class)
public class MixinFoo {

    public Foo bar() {
        return (Foo) (Object) this;
    }
}

< code>this的编译时类型似乎是< code > mixinfo ,但该方法实际上是动态插入的,因此在运行时,它将是< code>Foo。编译器不知道这一点;我们必须将它转换为< code>Foo,但这也会导致编译器错误。

先转换为< code>Object,然后转换为< code>Foo(双重转换)可以解决编译器的问题。请记住,如果该方法没有在运行时应用,这将导致运行时错误。

当然,这远远超出了介绍Java的技能水平。

能帅
2023-03-14

是的,我很确定这不是一件事。没有理由双重转换是必要的——它可能会摆脱关于不安全转换的编译警告(在这种情况下,你可能做错了),但除此之外,这是不对的。

我的意思是,有自动到字符串调用,例如println(“” i),但即使这样,你也不需要先投射到一个对象...

编辑:在阅读了Tom的答案后,我突然不确定这个答案——原语和(特别是)泛型实际上可以使用它。我现在没有能力测试任何东西,但是任何阅读这个答案的人都应该看看他的答案(可能会投赞成票)。

然而,我将坚持这样的观点,即没有(或者至少极少)充分的理由这样做,所提供的例子当然与此无关。

归松
2023-03-14

虽然“双重转换”当然不是一个常见的术语,您不应该看起来像是任何类型的引用转换,但您应该知道发生了什么(a<code>ClassCastException

为了完整性,在某些情况下,它不会CCE:

  • 如果该值实际上为null
  • 涉及原语的东西。(er,Objecttointgerto[unbox]int,或intto[lossy]byteto[正]char
  • 更改泛型类型参数。列表

 类似资料:
  • 我对Java非常陌生,尤其是编写泛型代码。我的任务是编写泛型函数,返回ResultSet对象的ID列的值。 父类有整数ID,子类有字符串ID(我知道有字符串ID很少见,但数据很具体) 所以在父类中,我最终得到了函数: 在子类中,我有一个覆盖父类的方法: 当我需要调用这个函数时,我只需要: 我的问题是,如果做双重铸造(T)((长) 可以吗?有没有更简单的方法来实现这个功能,我不知道?

  • 嗨,我最近看到了一个类似这样的问题 在我回答了这个问题后,事实证明我弄错了,我回答了整数。MIN_VALUE但正确的答案是整数。MAX_VALUE。经过进一步的测试,我意识到我对大于整数的int施加的任何双精度。MAX_VALUE只是使int等于整数。MAX_VALUE。例如 经过进一步的测试,我意识到如果你试图将long转换为int,似乎会将int分配给一个看似随机的数字。 所以我的问题是。到底

  • 铸龙是一款用于分析用户行为事件的 BI 软件。 特点如下 事件分析 埋点上报 漏斗分析 留存分析 智能路径分析 报表,面板管理 多平台部署,直接二进制部署无需搭建环境 技术栈主要用 mysql redis kafka clickhouse 系统组成 该系统分为以下四部分 埋点上报sdk report_server sinker manager 埋点上报sdk: 用于采集埋点信息,目前SDK支持类型

  • 问题内容: 在Objective-C中,我经常绕过块。我经常使用它们来实现有助于避免将内容存储到实例变量中的模式,从而避免线程/定时问题。 例如,我将它们分配给过孔,以便在动画结束时执行该块。(Objective-C可以将块视为对象;您也可以这样做和。) 但是,尝试在Swift和Objective-C中同时使用这些模式似乎很困难。( 编辑: 我们可以看到该语言仍在不断变化:已经对代码进行了修改,因

  • 在抽象工厂模式中,我使用泛型。我有一个扩展Serializable的BaseEntity接口,Employee类实现了BaseEntity。在抽象类中,我有一个getJavaObj方法 是一种方法,它接受并返回

  • 这会产生以下错误: 斯卡拉 我期待着一个TP类型的对象[试验],发生了什么?因为Sym和Def是协变类型。我错过什么了吗? 谢谢