【问题标题】:Is there a way to "cut down" a Java object to a inherited class?有没有办法将 Java 对象“削减”为继承类?
【发布时间】:2013-05-04 04:56:33
【问题描述】:

这就是我在 Java 中注意到的:

如果我上课:

class IntStorage
{
    public int i;

    public void setInt(int i) { this.i = i; }
    public int getInt() { return i; }
}

并继承它,并存储其他数据:

class IntAndStringStorage : IntStorage
{
    public String s;

    public void setString(String s) { this.s = s; }
    public String getString() { return s; }
}

我这样做:

IntAndStringStorage IandSstorage = new IntAndStringStorage();
IandSstorage.setString("Test");
IntStorage Istorage = (IntStorage)IandSstorage;
IntAndStorageStorage test = (IntAndStorageStorage)Istorage;
System.out.println(test.getString());

即使我将它转换为继承的类,它也是完全有效的。现在我假设信息仍在对象内部,那么我可以完全将其转换为继承的类而不保留旧信息吗?我不希望String 存储留在我的int 存储类中。

【问题讨论】:

  • class IntAndStringStorage : IntStorage 那是 Java 8 表示法吗?此处不编译。
  • hmmm 只是想稍微澄清一下,这意味着当您投射的对象是您存储相同对象的对象吗?继承语法看起来也很像 C#。
  • @Nomad101 我的意思是对象仍然是同一个对象。它只是被“掩盖”为另一种类型的对象。
  • 这是给我的一些动作脚本?
  • IntAndStringStorage 不是一个 IntStorage。继承前请三思。

标签: java class inheritance


【解决方案1】:

强制转换在 Java 中更改对象(与 C# 不同,Java 中的强制转换不能被重载)。因此,强制转换只会更改对象显示为的 [compile-time] 类型 - 将对象强制转换回原始类型是始终完全有效的。

要“削减”一个对象需要

  1. 创建一个新的对象(可能是基本类型),信息较少,或者;
  2. 有一个可变对象,该对象会抛出(即分配空值/默认值)到各种“剪切”字段。

此外,与依赖基类型相比,接口通常是公开某些“视图”的更好方式。

【讨论】:

  • +1 一个非常好的综合答案。我期待您的更多答案(以及您的名字;)
【解决方案2】:

在 Java 中最好的方法是根据 IntAndDataStorage 实例的 int 值创建一个新的 IntStorage。

IntStorage intStorage = new IntStorage(intAndSstorage.getInt());

假设您将 IntStorage(int) 构造函数添加到 IntStorage。不会有剩余的字符串。

【讨论】:

  • 或者添加一个拷贝构造函数;)
猜你喜欢
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 2016-09-18
  • 1970-01-01
  • 2011-02-16
  • 2013-07-01
相关资源
最近更新 更多