3

这就是我在 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

4

2 回答 2

13

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

要“削减”一个对象需要

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

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

于 2013-05-04T05:03:20.247 回答
2

在 Java 中做到这一点的最好方法是基于 IntAndDataStorage 实例 int 值创建一个新的 IntStorage。

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

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

于 2013-05-04T05:09:30.587 回答