【问题标题】:Cast to type which is not inherited转换为不被继承的类型
【发布时间】:2017-02-26 10:57:19
【问题描述】:

我有课可以说

public class Magic implements Serializable{
}

并且这个类不继承

public class Amount{
}

有什么方法可以将Magic 转换为Amount,我不会访问任何字段,我只需要魔法来“变成”数量吗?有什么办法吗?

【问题讨论】:

  • 你为什么需要这样做?
  • 没有。尝试这样做将在运行时以 ClassCastException 告终。你为什么想这么做?也许对于您的潜在业务问题还有另一种解决方案...
  • 如果他们没有任何关系,你为什么要这样做?
  • 因为我有一个需要输入“数量”的方法,但是我不能让 Magic 扩展 Amount(另一个我无法写入的 jar),我需要一种方法以某种方式让 Magic 成为 Amount,我无法修改这两个文件。
  • 那你为什么不用(Amount) null呢?你说过你不会接触 Amount 的任何成员。所以 null 和 Magic 实例一样好。

标签: java reflection casting


【解决方案1】:

不,没有。 Amount 的实例与Magic 的实例无关

即使这两个类看起来相同也是如此,但在你的情况下它们肯定不是。

在这种情况下,您需要忍受编写将Magic 转换为Amount 的代码的痛苦。可能在Amount 中有一个构造函数,它以Magic 实例作为参数。

或者,如果Amount 仅包含函数,则考虑将其重铸为interface,由Magic 实现。

【讨论】:

    【解决方案2】:

    您不能在 Java 中不相关的类型之间进行转换。如果您需要从 Magic 实例创建 Amount 实例,您应该有一个接收此类参数的构造函数:

    public class Amount {
        public Amount(Magic m) {
            // Initialize amount's fields...
        }
    }
    

    【讨论】:

      【解决方案3】:

      铸造不会自动将对象从一种类型转换为另一种类型。

      强制转换是一种禁用编译器类型检查的方法。强制转换唯一要做的就是告诉编译器:“这是一个对象,我比你更清楚这是什么类型的对象,所以我希望你把它当作这种类型的对象,而不是抱怨” .

      在运行时仍会进行类型检查,如果此时对象确实不是您所说的类型,您将获得ClassCastException

      强制转换无法自动将 Magic 对象转换为 Amount 对象。

      您需要自己编写代码,使用Magic对象的数据创建Amount对象。

      【讨论】:

        【解决方案4】:

        Magic 变为Amount 的唯一方法是让您的类:Magic 扩展Amount 类。

        您希望类之间有一个is a 链接,这是通过继承完成的。

        否则会收到编译错误。

        【讨论】:

          猜你喜欢
          • 2018-06-16
          • 2021-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-17
          • 1970-01-01
          相关资源
          最近更新 更多