【问题标题】:Possible to add a new class that can be cast to an existing final class?可以添加一个可以转换为现有最终类的新类吗?
【发布时间】:2015-06-08 18:14:08
【问题描述】:

我在库中定义了 A 类:

 public final class A {blah}

然后我想在某个地方使用新的 B 类来替换它:

A a = new A();  
A a = (A) new B();

B 拥有 A 中的所有方法和成员,所以这样做实际上是安全的,我可以在 C++ 中这样做。但是对于 Java,这种转换会导致异常。那么在Java中是否有任何解决方法或黑客行为? 另外,有没有办法在不接触虚拟机的情况下破解?

【问题讨论】:

  • 投射时遇到了哪个异常?
  • 在java中你会得到不兼容的类型转换编译器错误,因为B不扩展A(但是它不能扩展最终类)。
  • 不行不行不行。
  • 没有任何其他信息,这是不可能的。

标签: java class casting final


【解决方案1】:

虽然B 拥有A 拥有的所有方法和属性,但您不能将B 的对象转换为A 的引用。这意味着 -

A a = (A) new B(); 

除非B 扩展A,否则无效。

这里A 是最后一个类,所以你不能通过B 扩展A。您必须使 A 非最终结果,并且 B 必须扩展 A。那么上述转换将是有效的。

【讨论】:

    【解决方案2】:

    Java 的final 关键字的存在是为了防止子类化,所以简单的答案是。你可以使用PowerMock 之类的东西来做这种事情。不过,我不会在测试之外这样做。

    【讨论】:

    • 这是否意味着 PowerMock 允许扩展最终类?
    • 或剂量意味着PowerMock 允许将B 转换为A 其中BA 完全不同(只是问,因为我不知道@987654328 的功能@)?
    • 感谢您的提示。 PowerMock 实现了自己的类加载器,但我实际上是在 Android 上运行的。所以 PowerMock 在这里似乎不是一个好主意,但在其他地方可能有用。
    【解决方案3】:

    这是不可能的,因为你的 A 类是最终的。 final 类只是一个无法扩展的类。

    【讨论】:

      猜你喜欢
      • 2010-11-20
      • 2011-03-08
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      相关资源
      最近更新 更多