有没有一种方法可以将Java对象"削减"成一个继承类?

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());

即使我将其转换为继承类,它仍然是完全有效的。现在我假设信息仍然存在于对象中,那么我能否完全将其转换为继承类而不保留旧信息?我不想在我的int存储类中留下String存储。


5
class IntAndStringStorage : IntStorage 这是 Java 8 的表示法吗?在这里它无法编译。 - Andrew Thompson
1
嗯,只是想要一点澄清,你的意思是当你进行强制类型转换时,存储的对象与原对象相同吗?此外,继承语法看起来非常像C#。 - Nomad101
@Nomad101 我的意思是该对象仍然是同一个对象。只是被"伪装"成另一种类型的对象。 - user2348979
这是一些ActionScript给我看的吗? - AllTooSir
1
IntAndStringStorage 不是 IntStorage。在继承之前三思。 - yzn-pku
按照Java命名规范,变量应该以小写字母开头。 (http://www.oracle.com/technetwork/java/codeconventions-135099.html#367) - giampaolo
2个回答

13

在Java中,强制转换并不会改变对象(与C#不同,Java中的强制转换不能被重载)。因此,强制转换只会改变对象所呈现的[编译时]类型 - 将对象强制转换回原始类型是始终有效的

要“缩减”一个对象需要:

  1. 创建一个对象(可能是基类型),其中包含较少的信息;或者
  2. 有一个可变的对象,将各种“切掉”的字段抛弃(即分配null/默认值)。

此外,接口通常是公开某些“视图”的更好方法,而不是依赖于基本类型。


3
非常好的全面回答。我期待更多你的回答(和你的名字 ;))。 - Peter Lawrey

2
在Java中实现这个功能的最佳方法是基于IntAndDataStorage实例int值创建一个新的IntStorage。
IntStorage intStorage = new IntStorage(intAndSstorage.getInt());

假设您已经添加了IntStorage(int)构造函数到IntStorage中。那么就不会有字符串剩余。

1
或者添加一个复制构造函数 ;) - a better oliver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接