【问题标题】:Casting Interface to Class in Java将接口转换为 Java 中的类
【发布时间】:2017-12-30 11:18:35
【问题描述】:

在Java中有一个方法有一个参数,这个参数就是一个接口。使用这种方法我可以对具体类进行强制转换吗?

如何计算这种演员阵容的成本?

示例 - 将接口转换为类:

public void convertToClass(IUser iu) {          
        User u = (User) iu;
}

【问题讨论】:

  • 它与性能没有任何关系。这是一个设计问题。如果您接受 IUser 参数,但随后将其转换为 User,那么您首先不应该接受 IUser 作为参数。您应该需要一个 User 参数。
  • @Kayaman - 不过也有性能方面的问题,因为编译器必须插入 CHECKCAST 操作码。
  • @OliverCharlesworth 当然,但那是微观层面的东西。提供的代码实际上并没有多大意义。
  • Kayamans 的评论在很大程度上是正确的,但真正的设计问题是您需要从 User 访问一些东西,而 IUser 接口没有提供这些东西。
  • 应尽可能避免强制转换,但不是出于性能原因。您应该避免强制转换,因为强制转换会使您的代码的类型安全性降低。强制转换是一种绕过编译器类型检查的方法。 Kayaman 的建议很重要:如果方法需要 User 对象,则使用 User 类型的参数而不是 IUser

标签: java interface casting


【解决方案1】:

就像评论中所说的那样,实际上这不是性能问题,而是表达您的意图:如果您需要特定的类,则应该要求它,而不是接口。但是,通常情况是您可以要求一个接口,然后通过该接口进行操作,完全省略强制转换。这也是它通常应该做的方式。您应该探索这种可能性。

至于实际问题:演员表有一些开销,但在几乎任何用例中都无关紧要。开销来自检查转换是否可能,如果不是则抛出异常。如果您有兴趣进一步讨论有关强制转换的开销,您可以阅读更多关于它的信息here。如果你不想测量开销,你应该使用How do I write a correct micro-benchmark in Java?中列出的方法

【讨论】:

    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多